diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 3a6ac8cc..257924f3 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -716,6 +716,11 @@ ac_lotus.c: ac_mikuji.c: .text: [0x805B414C, 0x805B44C4] .data: [0x806C5C10, 0x806C5CA0] +ac_my_house.c: + .text: [0x805B4CF4, 0x805B63FC] + .rodata: [0x8064AA50, 0x8064AAA0] + .data: [0x806C5DC0, 0x806C6110] + .bss: [0x813280B0, 0x813280C0] ac_nameplate.c: .text: [0x805B63FC, 0x805B65C4] .data: [0x806C6110, 0x806C6138] diff --git a/include/ac_intro_demo.h b/include/ac_intro_demo.h index 1d30cc19..c6ca0164 100644 --- a/include/ac_intro_demo.h +++ b/include/ac_intro_demo.h @@ -8,24 +8,33 @@ extern "C" { #endif +enum { + aID_STATE_0, + aID_STATE_TAKEN_HOUSE, + aID_STATE_FREE_HOUSE, + // more? + + aID_STATE_NUM +}; + typedef struct actor_intor_demo_s INTRO_DEMO_ACTOR; struct actor_intor_demo_s { - ACTOR actor_class; - int action; - int rcn_action; - void (*action_proc)(ACTOR*, GAME*); - void* train1_actor_p; // TODO: correct type - void* station_master_actor_p; // TODO: correct type - void* rcn_guide_actor_p; // TODO: correct type - int player_in_intro_demo; - int player_intro_demo_state; - int selected_house; - int _198; - u8 first_field_bgm_state; - int _1A0; - int _1A4; - int _1A8; + ACTOR actor_class; + int action; + int rcn_action; + void (*action_proc)(ACTOR*, GAME*); + void* train1_actor_p; // TODO: correct type + void* station_master_actor_p; // TODO: correct type + void* rcn_guide_actor_p; // TODO: correct type + int player_in_intro_demo; + int player_intro_demo_state; + int selected_house; + int _198; + u8 first_field_bgm_state; + int _1A0; + int _1A4; + int _1A8; }; extern ACTOR_PROFILE Intro_Demo_Profile; @@ -35,4 +44,3 @@ extern ACTOR_PROFILE Intro_Demo_Profile; #endif #endif - diff --git a/include/ac_my_house.h b/include/ac_my_house.h index cbb272c5..fa656aca 100644 --- a/include/ac_my_house.h +++ b/include/ac_my_house.h @@ -3,32 +3,16 @@ #include "types.h" #include "m_actor.h" +#include "ac_structure.h" #ifdef __cplusplus extern "C" { #endif -typedef struct actor_my_house_s MY_HOUSE_ACTOR; +typedef struct my_house_actor_s MY_HOUSE_ACTOR; -struct actor_my_house_s { - ACTOR actor_class; - int _174; - cKF_SkeletonInfo_R_c keyframe; - int _1E8; - s_xyz work_area[15]; - s_xyz morph_area[15]; - u8 _2A0[0x2B0 - 0x2A0]; - int door_rotation_speed_idx; - int house_no; - int house_shape; - int _2BC; - int _2C0; - int intro_flag; - f32 door_pos_x; - f32 door_poz_z; - f32 door_rotation_speed; - f32 _2D4; - int season; +struct my_house_actor_s { + STRUCTURE_ACTOR structure_class; }; extern ACTOR_PROFILE MyHouse_Profile; @@ -38,4 +22,3 @@ extern ACTOR_PROFILE MyHouse_Profile; #endif #endif - diff --git a/include/m_collision_bg.h b/include/m_collision_bg.h index c0f968e1..29714b6b 100644 --- a/include/m_collision_bg.h +++ b/include/m_collision_bg.h @@ -11,218 +11,220 @@ extern "C" { #define mCoBG_HEIGHT_MAX 31 enum field_layer { - mCoBG_LAYER0, - mCoBG_LAYER1, - mCoBG_LAYER2, - mCoBG_LAYER3, + mCoBG_LAYER0, + mCoBG_LAYER1, + mCoBG_LAYER2, + mCoBG_LAYER3, - mCoBG_LAYER_NUM + mCoBG_LAYER_NUM }; enum { - mCoBG_FTR_TYPEA, - mCoBG_FTR_TYPEB_0, - mCoBG_FTR_TYPEB_180, - mCoBG_FTR_TYPEB_270, - mCoBG_FTR_TYPEB_90, - mCoBG_FTR_TYPEC, + mCoBG_FTR_TYPEA, + mCoBG_FTR_TYPEB_0, + mCoBG_FTR_TYPEB_180, + mCoBG_FTR_TYPEB_270, + mCoBG_FTR_TYPEB_90, + mCoBG_FTR_TYPEC, - mCoBG_FTR_TYPE_NUM + mCoBG_FTR_TYPE_NUM }; enum background_attribute { - /* TODO: finish */ - mCoBG_ATTRIBUTE_GRASS0, - mCoBG_ATTRIBUTE_GRASS1, - mCoBG_ATTRIBUTE_GRASS2, - mCoBG_ATTRIBUTE_GRASS3, - mCoBG_ATTRIBUTE_SOIL0, - mCoBG_ATTRIBUTE_SOIL1, - mCoBG_ATTRIBUTE_SOIL2, - mCoBG_ATTRIBUTE_STONE, - mCoBG_ATTRIBUTE_FLOOR, - mCoBG_ATTRIBUTE_BUSH, - mCoBG_ATTRIBUTE_HOLE, - mCoBG_ATTRIBUTE_WAVE, - mCoBG_ATTRIBUTE_WATER, - mCoBG_ATTRIBUTE_WATERFALL, - mCoBG_ATTRIBUTE_RIVER_N, - mCoBG_ATTRIBUTE_RIVER_NW, - mCoBG_ATTRIBUTE_RIVER_W, - mCoBG_ATTRIBUTE_RIVER_SW, - mCoBG_ATTRIBUTE_RIVER_S, - mCoBG_ATTRIBUTE_RIVER_SE, - mCoBG_ATTRIBUTE_RIVER_E, - mCoBG_ATTRIBUTE_RIVER_NE, - mCoBG_ATTRIBUTE_SAND, - mCoBG_ATTRIBUTE_WOOD, - mCoBG_ATTRIBUTE_SEA, - // ... + /* TODO: finish */ + mCoBG_ATTRIBUTE_GRASS0, + mCoBG_ATTRIBUTE_GRASS1, + mCoBG_ATTRIBUTE_GRASS2, + mCoBG_ATTRIBUTE_GRASS3, + mCoBG_ATTRIBUTE_SOIL0, + mCoBG_ATTRIBUTE_SOIL1, + mCoBG_ATTRIBUTE_SOIL2, + mCoBG_ATTRIBUTE_STONE, + mCoBG_ATTRIBUTE_FLOOR, + mCoBG_ATTRIBUTE_BUSH, + mCoBG_ATTRIBUTE_HOLE, + mCoBG_ATTRIBUTE_WAVE, + mCoBG_ATTRIBUTE_WATER, + mCoBG_ATTRIBUTE_WATERFALL, + mCoBG_ATTRIBUTE_RIVER_N, + mCoBG_ATTRIBUTE_RIVER_NW, + mCoBG_ATTRIBUTE_RIVER_W, + mCoBG_ATTRIBUTE_RIVER_SW, + mCoBG_ATTRIBUTE_RIVER_S, + mCoBG_ATTRIBUTE_RIVER_SE, + mCoBG_ATTRIBUTE_RIVER_E, + mCoBG_ATTRIBUTE_RIVER_NE, + mCoBG_ATTRIBUTE_SAND, + mCoBG_ATTRIBUTE_WOOD, + mCoBG_ATTRIBUTE_SEA, + // ... + + mCoBG_ATTRIBUTE_NONE = 100 }; enum { - mCoBG_PLANT0 = 0, /* Stay a sapling */ - mCoBG_PLANT1 = 1, /* Grow until the first stage of growth */ - mCoBG_PLANT2 = 2, /* Grow until the second stage of growth */ - mCoBG_PLANT3 = 3, /* Grow until the third stage of growth */ - mCoBG_PLANT4 = 4, /* Fully grow */ + mCoBG_PLANT0 = 0, /* Stay a sapling */ + mCoBG_PLANT1 = 1, /* Grow until the first stage of growth */ + mCoBG_PLANT2 = 2, /* Grow until the second stage of growth */ + mCoBG_PLANT3 = 3, /* Grow until the third stage of growth */ + mCoBG_PLANT4 = 4, /* Fully grow */ - mCoBG_KILL_PLANT = 7 /* No growth, all plants die on this unit */ + mCoBG_KILL_PLANT = 7 /* No growth, all plants die on this unit */ }; enum { - mCoBG_DIRECT_N, - mCoBG_DIRECT_W, - mCoBG_DIRECT_S, - mCoBG_DIRECT_E, - mCoBG_DIRECT_NW, - mCoBG_DIRECT_NE, - mCoBG_DIRECT_SE, - mCoBG_DIRECT_SW, + mCoBG_DIRECT_N, + mCoBG_DIRECT_W, + mCoBG_DIRECT_S, + mCoBG_DIRECT_E, + mCoBG_DIRECT_NW, + mCoBG_DIRECT_NE, + mCoBG_DIRECT_SE, + mCoBG_DIRECT_SW, - mCoBG_DIRECT_NUM + mCoBG_DIRECT_NUM }; enum { - mCoBG_AREA_N, - mCoBG_AREA_W, - mCoBG_AREA_S, - mCoBG_AREA_E, + mCoBG_AREA_N, + mCoBG_AREA_W, + mCoBG_AREA_S, + mCoBG_AREA_E, - mCoBG_AREA_NUM + mCoBG_AREA_NUM }; /* sizeof(mCoBG_CollisionData_c) == 4*/ typedef struct collision_bg_data_s { - /* 1------- -------- -------- -------- */ u32 shape:1; /* collision shape */ - /* -11111-- -------- -------- -------- */ u32 center:5; - /* ------11 111----- -------- -------- */ u32 top_left:5; - /* -------- ---11111 -------- -------- */ u32 bot_left:5; - /* -------- -------- 11111--- -------- */ u32 top_right:5; - /* -------- -------- -----111 11------ */ u32 bot_right:5; - /* -------- -------- -------- --111111 */ u32 unit_attribute:6; /* background_attribute type */ + /* 1------- -------- -------- -------- */ u32 shape : 1; /* collision shape */ + /* -11111-- -------- -------- -------- */ u32 center : 5; + /* ------11 111----- -------- -------- */ u32 top_left : 5; + /* -------- ---11111 -------- -------- */ u32 bot_left : 5; + /* -------- -------- 11111--- -------- */ u32 top_right : 5; + /* -------- -------- -----111 11------ */ u32 bot_right : 5; + /* -------- -------- -------- --111111 */ u32 unit_attribute : 6; /* background_attribute type */ } mCoBG_CollisionData_c; /* sizeof (mCoBG_Collision_u) == 4 */ typedef union collision_bg_u { - mCoBG_CollisionData_c data; - u32 raw; + mCoBG_CollisionData_c data; + u32 raw; } mCoBG_Collision_u; typedef struct collision_unit_info_s { - mCoBG_Collision_u* collision; - f32 leftUp_offset; - f32 leftDown_offset; - f32 rightDown_offset; - f32 rightUp_offset; - f32 base_height; - f32 pos_x; - f32 pos_z; - int ut_x; - int ut_z; - int shape; - u8 attribute; - mActor_name_t item; + mCoBG_Collision_u* collision; + f32 leftUp_offset; + f32 leftDown_offset; + f32 rightDown_offset; + f32 rightUp_offset; + f32 base_height; + f32 pos_x; + f32 pos_z; + int ut_x; + int ut_z; + int shape; + u8 attribute; + mActor_name_t item; } mCoBG_UnitInfo_c; -#define mCoBG_HIT_WALL (1 << 0) /* in contact with *any* wall */ +#define mCoBG_HIT_WALL (1 << 0) /* in contact with *any* wall */ #define mCoBG_HIT_WALL_FRONT (1 << 1) /* in contact with wall to the front */ #define mCoBG_HIT_WALL_RIGHT (1 << 2) /* in contact with wall to the right */ -#define mCoBG_HIT_WALL_LEFT (1 << 3) /* in contact with wall to the left */ -#define mCoBG_HIT_WALL_BACK (1 << 4) /* in contact with wall to the back */ +#define mCoBG_HIT_WALL_LEFT (1 << 3) /* in contact with wall to the left */ +#define mCoBG_HIT_WALL_BACK (1 << 4) /* in contact with wall to the back */ typedef struct collision_bg_check_result_s { - u32 on_ground:1; - u32 hit_attribute_wall:5; - u32 hit_wall:5; - u32 hit_wall_count:3; - u32 unk_flag0:1; - u32 unit_attribute:6; - u32 is_on_move_bg_obj:1; - u32 is_in_water:1; - u32 unk_flag1:1; - u32 unk_flag2:1; - u32 unk_flag3:1; - u32 unk_flag4:1; - u32 unk_flag5:1; - u32 unk_flag6:4; + u32 on_ground : 1; + u32 hit_attribute_wall : 5; + u32 hit_wall : 5; + u32 hit_wall_count : 3; + u32 unk_flag0 : 1; + u32 unit_attribute : 6; + u32 is_on_move_bg_obj : 1; + u32 is_in_water : 1; + u32 unk_flag1 : 1; + u32 unk_flag2 : 1; + u32 unk_flag3 : 1; + u32 unk_flag4 : 1; + u32 unk_flag5 : 1; + u32 unk_flag6 : 4; } mCoBG_CheckResult_c; typedef struct wall_info_s { - s16 angleY; - s16 type; + s16 angleY; + s16 type; } mCoBG_WallInfo_c; typedef struct collision_bg_check_s { - mCoBG_Collision_u collision_units[5]; - mCoBG_CheckResult_c result; - f32 wall_top_y; - f32 wall_bottom_y; - f32 ground_y; - mCoBG_WallInfo_c wall_info[2]; - s16 in_front_wall_angle_y; + mCoBG_Collision_u collision_units[5]; + mCoBG_CheckResult_c result; + f32 wall_top_y; + f32 wall_bottom_y; + f32 ground_y; + mCoBG_WallInfo_c wall_info[2]; + s16 in_front_wall_angle_y; } mCoBG_Check_c; typedef struct bg_side_contact_s { - s16 name; - s16 angle; + s16 name; + s16 angle; } mCoBG_side_contact_c; typedef struct bg_contact_s { - mCoBG_side_contact_c side_contact[5]; - int side_count; - s16 on_contact_names[5]; - int on_count; + mCoBG_side_contact_c side_contact[5]; + int side_count; + s16 on_contact_names[5]; + int on_count; } mCoBG_bg_contact_c; typedef struct bg_size_s { - f32 right_size; // x | *-> - f32 left_size; // x | <-* - f32 up_size; // z | ^ - f32 down_size; // z | v + f32 right_size; // x | *-> + f32 left_size; // x | <-* + f32 up_size; // z | ^ + f32 down_size; // z | v } mCoBG_bg_size_c; typedef struct bg_register_s { - xyz_t* wpos; - xyz_t* last_wpos; - s16* angle_y; - mCoBG_bg_contact_c* contact; - mCoBG_bg_size_c* bg_size; - xyz_t* base_ofs; - f32 height; - u32 attribute; - f32 active_dist; - f32* scale_percent; + xyz_t* wpos; + xyz_t* last_wpos; + s16* angle_y; + mCoBG_bg_contact_c* contact; + mCoBG_bg_size_c* bg_size; + xyz_t* base_ofs; + f32 height; + u32 attribute; + f32 active_dist; + f32* scale_percent; } mCoBG_bg_regist_c; typedef struct collision_offset_table_s { - u8 unit_attribute; - s8 centerRight_offset; - s8 leftUp_offset; - s8 leftDown_offset; - s8 rightDown_offset; - s8 rightUp_offset; - s8 shape; + u8 unit_attribute; + s8 centerRight_offset; + s8 leftUp_offset; + s8 leftDown_offset; + s8 rightDown_offset; + s8 rightUp_offset; + s8 shape; } mCoBG_OffsetTable_c; typedef struct collision_actor_info_s { - mActor_name_t name_id; - u8 _02; - u8 on_ground; - u8 _04; - u8 in_water; - u8 _06[2]; // alignment? - mCoBG_CheckResult_c* check_res_p; - xz_t speed_xz0; - xz_t speed_xz1; - xyz_t center_pos; - xyz_t old_center_pos; - xyz_t rev_pos; - u8 _40[4]; - f32 _44; - f32 _48; - f32 _4C; - u8 _50[0x20]; + mActor_name_t name_id; + u8 _02; + u8 on_ground; + u8 _04; + u8 in_water; + u8 _06[2]; // alignment? + mCoBG_CheckResult_c* check_res_p; + xz_t speed_xz0; + xz_t speed_xz1; + xyz_t center_pos; + xyz_t old_center_pos; + xyz_t rev_pos; + u8 _40[4]; + f32 _44; + f32 _48; + f32 _4C; + u8 _50[0x20]; } mCoBG_ActorInf_c; extern u32 mCoBG_Wpos2BgAttribute_Original(xyz_t wpos); @@ -235,15 +237,17 @@ extern int mCoBG_CheckHole_OrgAttr(u32 attribute); extern f32 mCoBG_GetBgY_OnlyCenter_FromWpos(xyz_t wpos, f32 dist); extern f32 mCoBG_GetBgY_OnlyCenter_FromWpos2(xyz_t wpos, f32 foot_dist); extern int mCoBG_Attribute2CheckPlant(u32 attribute, const xyz_t* wpos); -extern void mCoBG_BgCheckControll(xyz_t* reverse_pos, ACTOR* actor, f32 check_range, f32 offset_y, s16 wall_attr_check, s16 no_reverse, s16 check_type); +extern void mCoBG_BgCheckControll(xyz_t* reverse_pos, ACTOR* actor, f32 check_range, f32 offset_y, s16 wall_attr_check, + s16 no_reverse, s16 check_type); extern int mCoBG_Height2GetLayer(f32 height); extern void mCoBG_SetPlussOffset(xyz_t wpos, s16 offset, s16 new_attrib); -extern int mCoBG_GetLayer(const xyz_t* wpos); +extern int mCoBG_GetLayer(const xyz_t* wpos); extern int mCoBG_BnumUnum2HoleNumber(int block_x, int block_z, int ut_x, int ut_z); extern u32 mCoBG_UtNum2BgAttr(int ut_x, int ut_z); extern f32 mCoBG_UtNum2UtCenterY(int ut_x, int ut_z); extern int mCoBG_CheckCliffAttr(u32 attribute); extern void mCoBG_SetPluss5PointOffset_file(xyz_t pos, mCoBG_OffsetTable_c offsetptr, const char* file, int line); +#define mCoBG_SetPluss5PointOffset(pos, offsetptr) mCoBG_SetPluss5PointOffset_file(pos, offsetptr, __FILE__, __LINE__); extern int mCoBG_Change2PoorAttr(mCoBG_Collision_u* col); extern int mCoBG_CheckHole(xyz_t wpos); extern int mCoBG_CheckSkySwing(xyz_t wpos); diff --git a/include/m_common_data.h b/include/m_common_data.h index 79f4de6c..d920fcdc 100644 --- a/include/m_common_data.h +++ b/include/m_common_data.h @@ -209,8 +209,7 @@ typedef struct common_data_s { /* 0x0264E4 */ mNpc_NpcList_c island_npclist[1]; // TODO: define for island npc count /* 0x02651C */ mActor_name_t house_owner_name; /* 0x02651E */ mActor_name_t last_field_id; - /* 0x026520 */ u8 - in_initial_block; /* when TRUE, the player is in the acre which they exited a building. FALSE otherwise. */ + /* 0x026520 */ u8 in_initial_block; /* when TRUE, the player is in acre they exited a building. FALSE otherwise. */ /* 0x026521 */ u8 submenu_disabled; /* when set, submenus cannot be accessed from start button */ /* 0x026522 */ u8 sunlight_flag; /* 0x026523 */ u8 train_flag; diff --git a/include/m_name_table.h b/include/m_name_table.h index 9b52e8b9..77da3de9 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -2699,6 +2699,10 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define NPC_END (NPC_START + 236) #define DUMMY_START 0xF000 +#define DUMMY_HOUSE0 0xF0F3 +#define DUMMY_HOUSE1 0xF0F4 +#define DUMMY_HOUSE2 0xF0F5 +#define DUMMY_HOUSE3 0xF0F6 #define DUMMY_HANIWA0 0xF0FB #define DUMMY_HANIWA1 (DUMMY_HANIWA0 + 1) #define DUMMY_HANIWA2 (DUMMY_HANIWA1 + 1) diff --git a/include/m_player_lib.h b/include/m_player_lib.h index 3264432c..470ac9ad 100644 --- a/include/m_player_lib.h +++ b/include/m_player_lib.h @@ -27,7 +27,7 @@ extern void mPlib_change_player_cloth_info_lv2(Private_c* priv, mActor_name_t cl extern int mPlib_Get_address_able_display(); extern int mPlib_get_player_actor_main_index(GAME* game); extern int mPlib_check_player_actor_main_index_AllWade(GAME_PLAY* play); -extern int mPlib_request_main_demo_wait_type1(GAME_PLAY* play, int param_2, void* param_3); +extern int mPlib_request_main_demo_wait_type1(GAME* game, int param_2, void* param_3); extern int mPlib_request_main_talk_type1(GAME_PLAY* play, ACTOR* other_actor, int turn, int flag); extern int mPlib_request_main_talk_end_type1(GAME_PLAY* play, int return_demo_wait, int return_get_golden_axe_demo); extern int mPlib_request_main_door_type1(GAME* game, const xyz_t* pos, s16 angle_y, int door_type, void* door_label); @@ -45,7 +45,8 @@ extern int mPlib_Check_able_force_speak_label(GAME* game, ACTOR* label); extern int mPlib_able_submenu_type1(GAME* game); extern void mPlib_request_main_demo_wait_from_submenu(ACTOR* force_speak_label); extern void mPlib_Load_PlayerTexAndPallet(void* tex_p, void* pal_p, int idx); -extern void mPlib_request_main_give_from_submenu(mActor_name_t disp_item, int submenu_ovl, int present_flag, int counter_flag); +extern void mPlib_request_main_give_from_submenu(mActor_name_t disp_item, int submenu_ovl, int present_flag, + int counter_flag); extern int mPlib_Check_tree_shaken_big(const xyz_t* pos); extern int mPlib_Check_tree_shaken_little(const xyz_t* pos); extern int mPlib_request_main_recieve_wait_type1(GAME* game, mActor_name_t item, int counter_flag); @@ -56,6 +57,8 @@ extern int mPlib_Get_end_player_demo_walk(); extern int mPlib_request_main_demo_geton_boat_type1(f32 goal_x, f32 goal_z, s16 angleY); extern int mPlib_request_main_demo_getoff_boat_standup_type1(const xyz_t* pos, s16 angleY); extern int mPlib_check_player_actor_main_index_RecieveMove(GAME* game); +extern int mPlib_check_label_player_demo_wait(GAME* game, void* label); +extern int mPlib_check_player_outdoor_start(GAME* game); extern mPlayer_change_data_from_submenu_c* mPlib_Get_change_data_from_submenu_p(); diff --git a/include/m_scene.h b/include/m_scene.h index 6e8bc216..017aa6af 100644 --- a/include/m_scene.h +++ b/include/m_scene.h @@ -13,125 +13,138 @@ extern "C" { #define mSc_ARENA_SIZE 0xA000 +enum { + mSc_DIRECT_SOUTH, + mSc_DIRECT_SOUTH_EAST, + mSc_DIRECT_EAST, + mSc_DIRECT_NORTH_EAST, + mSc_DIRECT_NORTH, + mSc_DIRECT_NORTH_WEST, + mSc_DIRECT_WEST, + mSc_DIRECT_SOUTH_WEST, + + mSc_DIRECT_NUM +}; + typedef struct door_data_s { - int next_scene_id; - u8 exit_orientation; - u8 exit_type; // 0 = normal, 1 = restart game? - u16 extra_data; - s_xyz exit_position; - mActor_name_t door_actor_name; - u8 wipe_type; - u8 pad[3]; // possibly necessary due to struct copy + int next_scene_id; + u8 exit_orientation; + u8 exit_type; // 0 = normal, 1 = restart game? + u16 extra_data; + s_xyz exit_position; + mActor_name_t door_actor_name; + u8 wipe_type; + u8 pad[3]; // possibly necessary due to struct copy } Door_data_c; #define mSc_OBJECT_BANK_NUM 70 typedef struct object_bank_s { - s16 bank_id; - char* ram_start; - char* dma_start; - u32 rom_addr; - size_t size; - u32 _14; - int _18; - int _1C; - int _20; - int _24; - int _28; - OSMessageQueue* msg_queue_p; - OSMessage _30_msg; - OSMessageQueue dma_controller_msg_queue; - OSMessage dma_controller_msg; - s16 num_exist; - u8 part_id; - u8 state; + s16 bank_id; + char* ram_start; + char* dma_start; + u32 rom_addr; + size_t size; + u32 _14; + int _18; + int _1C; + int _20; + int _24; + int _28; + OSMessageQueue* msg_queue_p; + OSMessage _30_msg; + OSMessageQueue dma_controller_msg_queue; + OSMessage dma_controller_msg; + s16 num_exist; + u8 part_id; + u8 state; } Object_Bank_c; typedef struct object_exchange_s { - Object_Bank_c banks[mSc_OBJECT_BANK_NUM]; - int bank_idx; - int keep_id; - int exchange_id; - char* next_bank_ram_address; - char* max_ram_address; - char* start_address_save[2]; - char* end_address_save[2]; - char* _194C; - int selected_partition; - int _1954; + Object_Bank_c banks[mSc_OBJECT_BANK_NUM]; + int bank_idx; + int keep_id; + int exchange_id; + char* next_bank_ram_address; + char* max_ram_address; + char* start_address_save[2]; + char* end_address_save[2]; + char* _194C; + int selected_partition; + int _1954; } Object_Exchange_c; enum { - mSc_SCENE_DATA_TYPE_PLAYER_PTR, - mSc_SCENE_DATA_TYPE_CTRL_ACTOR_PTR, - mSc_SCENE_DATA_TYPE_ACTOR_PTR, - mSc_SCENE_DATA_TYPE_OBJECT_EXCHANGE_BANK_PTR, - mSc_SCENE_DATA_TYPE_DOOR_DATA_PTR, - mSc_SCENE_DATA_TYPE_FIELD_CT, - mSc_SCENE_DATA_TYPE_MY_ROOM_CT, - mSc_SCENE_DATA_TYPE_ARRANGE_ROOM_CT, - mSc_SCENE_DATA_TYPE_ARRANGE_FURNITURE_CT, - mSc_SCENE_DATA_TYPE_SOUND, - mSc_SCENE_DATA_TYPE_END, + mSc_SCENE_DATA_TYPE_PLAYER_PTR, + mSc_SCENE_DATA_TYPE_CTRL_ACTOR_PTR, + mSc_SCENE_DATA_TYPE_ACTOR_PTR, + mSc_SCENE_DATA_TYPE_OBJECT_EXCHANGE_BANK_PTR, + mSc_SCENE_DATA_TYPE_DOOR_DATA_PTR, + mSc_SCENE_DATA_TYPE_FIELD_CT, + mSc_SCENE_DATA_TYPE_MY_ROOM_CT, + mSc_SCENE_DATA_TYPE_ARRANGE_ROOM_CT, + mSc_SCENE_DATA_TYPE_ARRANGE_FURNITURE_CT, + mSc_SCENE_DATA_TYPE_SOUND, + mSc_SCENE_DATA_TYPE_END, - mSc_SCENE_DATA_TYPE_NUM + mSc_SCENE_DATA_TYPE_NUM }; typedef struct { - u8 type; - u8 num_actors; - Actor_data* data_p; + u8 type; + u8 num_actors; + Actor_data* data_p; } Scene_Word_Data_Actor_c; typedef struct { - u8 type; - u8 num_ctrl_actors; - s16* ctrl_actor_profile_p; + u8 type; + u8 num_ctrl_actors; + s16* ctrl_actor_profile_p; } Scene_Word_Data_Ctrl_Actor_c; typedef struct { - u8 type; - u8 num_banks; - s16* banks_p; + u8 type; + u8 num_banks; + s16* banks_p; } Scene_Word_Data_Object_Bank_c; typedef struct { - u8 type; - u8 num_doors; - Door_data_c* door_data_p; + u8 type; + u8 num_doors; + Door_data_c* door_data_p; } Scene_Word_Data_Door_Data_c; typedef struct { - u8 type; - u8 item_type; - u8 bg_num; - u16 bg_disp_size; - u8 room_type; - u8 draw_type; + u8 type; + u8 item_type; + u8 bg_num; + u16 bg_disp_size; + u8 room_type; + u8 draw_type; } Scene_Word_Data_FieldCt_c; typedef struct { - u8 type; - u8 arrange_ftr_num; + u8 type; + u8 arrange_ftr_num; } Scene_Word_Data_ArrangeFurniture_ct_c; typedef struct { - u8 type; + u8 type; } Scene_Word_Data_Misc_c; typedef union scene_word_u { - Scene_Word_Data_Misc_c misc; /* MY_ROOM_CT, ARRANGE_ROOM_CT, ARRANGE_FURNITURE_CT, SOUND */ - Scene_Word_Data_Actor_c actor; /* PLAYER_PTR, ACTOR_PTR */ - Scene_Word_Data_Ctrl_Actor_c control_actor; - Scene_Word_Data_Object_Bank_c object_bank; - Scene_Word_Data_Door_Data_c door_data; - Scene_Word_Data_FieldCt_c field_ct; - Scene_Word_Data_ArrangeFurniture_ct_c arrange_ftr_ct; + Scene_Word_Data_Misc_c misc; /* MY_ROOM_CT, ARRANGE_ROOM_CT, ARRANGE_FURNITURE_CT, SOUND */ + Scene_Word_Data_Actor_c actor; /* PLAYER_PTR, ACTOR_PTR */ + Scene_Word_Data_Ctrl_Actor_c control_actor; + Scene_Word_Data_Object_Bank_c object_bank; + Scene_Word_Data_Door_Data_c door_data; + Scene_Word_Data_FieldCt_c field_ct; + Scene_Word_Data_ArrangeFurniture_ct_c arrange_ftr_ct; } Scene_Word_u; typedef struct door_info_s { - u8 num_doors; - Door_data_c* door_data_p; + u8 num_doors; + Door_data_c* door_data_p; } Door_info_c; extern Scene_Word_u test01_info[]; @@ -202,7 +215,6 @@ extern int goto_next_scene(GAME_PLAY* play, int next_idx, int update_player_mode extern int goto_emu_game(GAME_PLAY* play, u8 famicom_rom_id); extern void return_emu_game(GAME* game); - #ifdef __cplusplus } #endif diff --git a/src/ac_haniwa_move.c_inc b/src/ac_haniwa_move.c_inc index 626e9c6b..5b9d94fc 100644 --- a/src/ac_haniwa_move.c_inc +++ b/src/ac_haniwa_move.c_inc @@ -1,821 +1,748 @@ static void aHNW_setupAction(ACTOR* actor, GAME* game, int action); static int aHNW_set_save_permission() { - u32 player_no = Common_Get(player_no); - PersonalID_c* pid; - mHm_hs_c* house; - int res = FALSE; + u32 player_no = Common_Get(player_no); + PersonalID_c* pid; + mHm_hs_c* house; + int res = FALSE; - if (player_no < PLAYER_NUM) { - int arrange_idx = mHS_get_arrange_idx(player_no); - house = Save_GetPointer(homes[arrange_idx]); - pid = &Save_Get(private[player_no]).player_ID; + if (player_no < PLAYER_NUM) { + int arrange_idx = mHS_get_arrange_idx(player_no); + house = Save_GetPointer(homes[arrange_idx]); + pid = &Save_Get(private[player_no]).player_ID; - if (mPr_NullCheckPersonalID(pid) != TRUE && - mPr_CheckCmpPersonalID(pid, &house->ownerID) == TRUE - ) { - res = TRUE; - house->flags.has_saved = TRUE; + if (mPr_NullCheckPersonalID(pid) != TRUE && mPr_CheckCmpPersonalID(pid, &house->ownerID) == TRUE) { + res = TRUE; + house->flags.has_saved = TRUE; + } } - } - return res; + return res; } static void aHNW_search_player(ACTOR* actor) { - chase_angle(&actor->shape_info.rotation.y, actor->player_angle_y, 0x0600); + chase_angle(&actor->shape_info.rotation.y, actor->player_angle_y, 0x0600); } static void aHNW_search_front(ACTOR* actor, int house_idx) { - s16 target_angle[mHS_HOUSE_NUM] = { 8000, -8000, 8000, -8000 }; + s16 target_angle[mHS_HOUSE_NUM] = { 8000, -8000, 8000, -8000 }; - chase_angle(&actor->shape_info.rotation.y, target_angle[house_idx], 0x0600); + chase_angle(&actor->shape_info.rotation.y, target_angle[house_idx], 0x0600); } static int aHNW_check_keep_item(ACTOR* actor) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - Haniwa_Item_c* haniwa_item = Save_Get(homes[haniwa->house_idx]).haniwa.items; - int i; - int res = FALSE; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + Haniwa_Item_c* haniwa_item = Save_Get(homes[haniwa->house_idx]).haniwa.items; + int i; + int res = FALSE; - for (i = 0; i < HANIWA_ITEM_HOLD_NUM; i++) { - if (haniwa_item->item != EMPTY_NO) { - res = TRUE; - break; + for (i = 0; i < HANIWA_ITEM_HOLD_NUM; i++) { + if (haniwa_item->item != EMPTY_NO) { + res = TRUE; + break; + } + + haniwa_item++; } - - haniwa_item++; - } - return res; + return res; } static void aHNW_set_proceeds_str(Haniwa_c* haniwa) { - u8 str[7]; + u8 str[7]; - mFont_UnintToString(str, 7, haniwa->bells, 6, TRUE, FALSE, TRUE); - mMsg_Set_free_str(mMsg_Get_base_window_p(), 0, str, 7); + mFont_UnintToString(str, 7, haniwa->bells, 6, TRUE, FALSE, TRUE); + mMsg_Set_free_str(mMsg_Get_base_window_p(), 0, str, 7); } static int aHNW_check_handOver_proceeds(Haniwa_c* haniwa) { - int handOver = FALSE; - u32 money = Common_Get(now_private)->inventory.wallet + haniwa->bells; + int handOver = FALSE; + u32 money = Common_Get(now_private)->inventory.wallet + haniwa->bells; - if (money < mPr_WALLET_MAX) { - Common_Get(now_private)->inventory.wallet = money; - handOver = TRUE; - } - else { - u32 num_30k_bell_bags = (money - mPr_WALLET_MAX) / 30000 + 1; + if (money < mPr_WALLET_MAX) { + Common_Get(now_private)->inventory.wallet = money; + handOver = TRUE; + } else { + u32 num_30k_bell_bags = (money - mPr_WALLET_MAX) / 30000 + 1; - if (mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) >= num_30k_bell_bags) { - handOver = TRUE; + if (mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) >= + num_30k_bell_bags) { + handOver = TRUE; - for (num_30k_bell_bags; num_30k_bell_bags != 0; num_30k_bell_bags--) { - mPr_SetFreePossessionItem(Common_Get(now_private), ITM_MONEY_30000, mPr_ITEM_COND_NORMAL); - money -= 30000; - } + for (num_30k_bell_bags; num_30k_bell_bags != 0; num_30k_bell_bags--) { + mPr_SetFreePossessionItem(Common_Get(now_private), ITM_MONEY_30000, mPr_ITEM_COND_NORMAL); + money -= 30000; + } - Common_Get(now_private)->inventory.wallet = money; + Common_Get(now_private)->inventory.wallet = money; + } else { + u8 str[5]; + + mFont_UnintToString(str, 5, num_30k_bell_bags, 5, TRUE, FALSE, TRUE); + mMsg_Set_free_str(mMsg_Get_base_window_p(), 1, str, 5); + } } - else { - u8 str[5]; - mFont_UnintToString(str, 5, num_30k_bell_bags, 5, TRUE, FALSE, TRUE); - mMsg_Set_free_str(mMsg_Get_base_window_p(), 1, str, 5); - } - } - - return handOver; + return handOver; } static int aHNW_check_house_door(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - int res = FALSE; - GAME_PLAY* play = (GAME_PLAY*)game; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + int res = FALSE; + GAME_PLAY* play = (GAME_PLAY*)game; - if (Common_Get(reset_flag) == TRUE) { - ACTOR* talk_actor = mDemo_Get_talk_actor(); + if (Common_Get(reset_flag) == TRUE) { + ACTOR* talk_actor = mDemo_Get_talk_actor(); - if (talk_actor == NULL && chkTrigger(BUTTON_A)) { - PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); + if (talk_actor == NULL && chkTrigger(BUTTON_A)) { + PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); - if (mDemo_Check_DiffAngle_forTalk((actor->player_angle_y - player->actor_class.shape_info.rotation.y) - -0x8000) == TRUE) { - Common_Set(reset_type, 4); - } - } + if (mDemo_Check_DiffAngle_forTalk((actor->player_angle_y - player->actor_class.shape_info.rotation.y) - + -0x8000) == TRUE) { + Common_Set(reset_type, 4); + } + } - res = TRUE; - } - else { - mDemo_Clip_c* demo_clip = Common_Get(clip).demo_clip; - - if (demo_clip != NULL) { - INTRO_DEMO_ACTOR* demo_class = (INTRO_DEMO_ACTOR*)demo_clip->class; - if (demo_class != NULL && demo_clip->type == mDemo_CLIP_TYPE_INTRO_DEMO && - mEv_CheckFirstIntro() && demo_class->player_intro_demo_state != 0) { res = TRUE; - } - } - } + } else { + mDemo_Clip_c* demo_clip = Common_Get(clip).demo_clip; - return res; + if (demo_clip != NULL) { + INTRO_DEMO_ACTOR* demo_class = (INTRO_DEMO_ACTOR*)demo_clip->class; + if (demo_class != NULL && demo_clip->type == mDemo_CLIP_TYPE_INTRO_DEMO && mEv_CheckFirstIntro() && + demo_class->player_intro_demo_state != 0) { + res = TRUE; + } + } + } + + return res; } static void aHNW_wait(ACTOR* actor, GAME* game) { - if (actor->player_distance_xz < 80.0f) { - aHNW_setupAction(actor, game, aHNW_ACTION_DANCE); - } + if (actor->player_distance_xz < 80.0f) { + aHNW_setupAction(actor, game, aHNW_ACTION_DANCE); + } } static int aHNW_decide_msg_idx_dance(ACTOR* actor) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - Haniwa_c* house_haniwa; - int house_idx = haniwa->house_idx; - int player_is_owner = Common_Get(player_no) == mHS_get_pl_no(haniwa->house_idx); - int res; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + Haniwa_c* house_haniwa; + int house_idx = haniwa->house_idx; + int player_is_owner = Common_Get(player_no) == mHS_get_pl_no(haniwa->house_idx); + int res; + if (mPr_NullCheckPersonalID(&Save_Get(homes[house_idx]).ownerID) == TRUE) { + res = aHNW_MSG_NO_OWNER; /* no one owns this house */ + } else if (player_is_owner == TRUE) { + Haniwa_c* house_haniwa = &Save_Get(homes[house_idx]).haniwa; + int house_arrange_idx = mHS_get_arrange_idx(Common_Get(player_no)); + mHm_hs_c* house = Save_GetPointer(homes[house_arrange_idx]); + if (house->flags.has_saved == FALSE && mEv_CheckFirstJob() == TRUE && + mNpc_GetFriendAnimalNum(&Common_Get(now_private)->player_ID) == 0) { + res = + aHNW_MSG_NEED_FRIEND; /* player owns this house, but is in intro and has not spoken to any villagers */ + } else if (house_haniwa->bells != 0) { + res = aHNW_MSG_PROCEEDS; + } else { + res = aHNW_MSG_NORMAL; + } - if (mPr_NullCheckPersonalID(&Save_Get(homes[house_idx]).ownerID) == TRUE) { - res = aHNW_MSG_NO_OWNER; /* no one owns this house */ - } - else if (player_is_owner == TRUE) { - Haniwa_c* house_haniwa = &Save_Get(homes[house_idx]).haniwa; - int house_arrange_idx = mHS_get_arrange_idx(Common_Get(player_no)); - mHm_hs_c* house = Save_GetPointer(homes[house_arrange_idx]); - if (house->flags.has_saved == FALSE && - mEv_CheckFirstJob() == TRUE && mNpc_GetFriendAnimalNum(&Common_Get(now_private)->player_ID) == 0 - ) { - res = aHNW_MSG_NEED_FRIEND; /* player owns this house, but is in intro and has not spoken to any villagers */ - } - else if (house_haniwa->bells != 0) { - res = aHNW_MSG_PROCEEDS; - } - else { - res = aHNW_MSG_NORMAL; + /* player owns house but gyroid has bells from other players */ + } else { + res = aHNW_MSG_OTHER_OWNER; /* another player owns house */ } - /* player owns house but gyroid has bells from other players */ - } - else { - res = aHNW_MSG_OTHER_OWNER; /* another player owns house */ - } - - return res; + return res; } - static void aHNW_set_talk_info_dance(ACTOR* actor) { - static int msg_no[aHNW_MSG_NUM] = { - 0x0934, /* aHNW_MSG_NO_OWNER */ - 0x0935, /* aHNW_MSG_PROCEEDS */ - 0x0925, /* aHNW_MSG_NORMAL */ - 0x0928, /* aHNW_MSG_OTHER_OWNER */ - 0x092E /* aHNW_MSG_NEED_FRIEND */ - }; + static int msg_no[aHNW_MSG_NUM] = { + 0x0934, /* aHNW_MSG_NO_OWNER */ + 0x0935, /* aHNW_MSG_PROCEEDS */ + 0x0925, /* aHNW_MSG_NORMAL */ + 0x0928, /* aHNW_MSG_OTHER_OWNER */ + 0x092E /* aHNW_MSG_NEED_FRIEND */ + }; - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - int house_idx = haniwa->house_idx; - Haniwa_c* house_haniwa = &Save_Get(homes[house_idx]).haniwa; - int msg_idx = aHNW_decide_msg_idx_dance(actor); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + int house_idx = haniwa->house_idx; + Haniwa_c* house_haniwa = &Save_Get(homes[house_idx]).haniwa; + int msg_idx = aHNW_decide_msg_idx_dance(actor); - switch (msg_idx) { - case aHNW_MSG_PROCEEDS: - { - aHNW_set_proceeds_str(house_haniwa); - break; + switch (msg_idx) { + case aHNW_MSG_PROCEEDS: { + aHNW_set_proceeds_str(house_haniwa); + break; + } + + case aHNW_MSG_OTHER_OWNER: { + mMsg_Set_mail_str(mMsg_Get_base_window_p(), 0, house_haniwa->message, HANIWA_MESSAGE_LEN); + break; + } } - case aHNW_MSG_OTHER_OWNER: - { - mMsg_Set_mail_str(mMsg_Get_base_window_p(), 0, house_haniwa->message, HANIWA_MESSAGE_LEN); - break; - } - } - - mDemo_Set_msg_num(msg_no[msg_idx]); + mDemo_Set_msg_num(msg_no[msg_idx]); } static void aHNW_dance(ACTOR* actor, GAME* game) { - static int next_act_idx[aHNW_MSG_NUM] = { - aHNW_ACTION_TALK_END_WAIT, /* aHNW_MSG_NO_OWNER */ - aHNW_ACTION_CHECK_PROCEEDS, /* aHNW_MSG_PROCEEDS */ - aHNW_ACTION_TALK_WITH_MASTER, /* aHNW_MSG_NORMAL */ - aHNW_ACTION_TALK_WITH_GUEST, /* aHNW_MSG_OTHER_OWNER */ - aHNW_ACTION_TALK_END_WAIT /* aHNW_MSG_NEED_FRIEND */ - }; + static int next_act_idx[aHNW_MSG_NUM] = { + aHNW_ACTION_TALK_END_WAIT, /* aHNW_MSG_NO_OWNER */ + aHNW_ACTION_CHECK_PROCEEDS, /* aHNW_MSG_PROCEEDS */ + aHNW_ACTION_TALK_WITH_MASTER, /* aHNW_MSG_NORMAL */ + aHNW_ACTION_TALK_WITH_GUEST, /* aHNW_MSG_OTHER_OWNER */ + aHNW_ACTION_TALK_END_WAIT /* aHNW_MSG_NEED_FRIEND */ + }; - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - if (actor->player_distance_xz > 90.0f) { - aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); - } - else { - if (mDemo_Check(mDemo_TYPE_TALK, (ACTOR*)haniwa) == TRUE && mDemo_Check_ListenAble() == FALSE) { - int msg_idx = aHNW_decide_msg_idx_dance(actor); - mDemo_Set_ListenAble(); - aHNW_setupAction(actor, game, next_act_idx[msg_idx]); + if (actor->player_distance_xz > 90.0f) { + aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); + } else { + if (mDemo_Check(mDemo_TYPE_TALK, (ACTOR*)haniwa) == TRUE && mDemo_Check_ListenAble() == FALSE) { + int msg_idx = aHNW_decide_msg_idx_dance(actor); + mDemo_Set_ListenAble(); + aHNW_setupAction(actor, game, next_act_idx[msg_idx]); + } else if (aHNW_check_house_door((ACTOR*)haniwa, game) == FALSE) { + mDemo_Request(mDemo_TYPE_TALK, (ACTOR*)haniwa, &aHNW_set_talk_info_dance); + } } - else if (aHNW_check_house_door((ACTOR*)haniwa, game) == FALSE) { - mDemo_Request(mDemo_TYPE_TALK, (ACTOR*)haniwa, &aHNW_set_talk_info_dance); - } - } } static void aHNW_check_proceeds(ACTOR* actor, GAME* game) { - static int msg_no[aHNW_HANDOVER_NUM] = { - 0x0936, /* aHNW_HANDOVER_YES */ - 0x0937 /* aHNW_HANDOVER_NO */ - }; + static int msg_no[aHNW_HANDOVER_NUM] = { + 0x0936, /* aHNW_HANDOVER_YES */ + 0x0937 /* aHNW_HANDOVER_NO */ + }; - static int next_act_idx[aHNW_HANDOVER_NUM] = { - aHNW_ACTION_TALK_WITH_MASTER, /* aHNW_HANDOVER_YES */ - aHNW_ACTION_TALK_END_WAIT /* aHNW_HANDOVER_NO */ - }; + static int next_act_idx[aHNW_HANDOVER_NUM] = { + aHNW_ACTION_TALK_WITH_MASTER, /* aHNW_HANDOVER_YES */ + aHNW_ACTION_TALK_END_WAIT /* aHNW_HANDOVER_NO */ + }; - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9)) { - int house_idx = haniwa->house_idx; - Haniwa_c* house_haniwa = &Save_Get(homes[house_idx]).haniwa; - int handover_state; + if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9)) { + int house_idx = haniwa->house_idx; + Haniwa_c* house_haniwa = &Save_Get(homes[house_idx]).haniwa; + int handover_state; - if (aHNW_check_handOver_proceeds(house_haniwa) == TRUE) { - house_haniwa->bells = 0; - handover_state = aHNW_HANDOVER_YES; + if (aHNW_check_handOver_proceeds(house_haniwa) == TRUE) { + house_haniwa->bells = 0; + handover_state = aHNW_HANDOVER_YES; + } else { + handover_state = aHNW_HANDOVER_NO; + } + + mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), msg_no[handover_state]); + aHNW_setupAction(actor, game, next_act_idx[handover_state]); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); } - else { - handover_state = aHNW_HANDOVER_NO; - } - - mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), msg_no[handover_state]); - aHNW_setupAction(actor, game, next_act_idx[handover_state]); - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - } } static void aHNW_talk_with_master(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9) && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { - int action = -1; + if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9) && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { + int action = -1; - switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { - case mChoice_CHOICE0: - { - action = aHNW_ACTION_SAVE_CHECK; - break; - } + switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { + case mChoice_CHOICE0: { + action = aHNW_ACTION_SAVE_CHECK; + break; + } - case mChoice_CHOICE1: - { - action = aHNW_ACTION_MENU_OPEN_WAIT; - haniwa->submenu_type = mSM_OVL_INVENTORY; - break; - } + case mChoice_CHOICE1: { + action = aHNW_ACTION_MENU_OPEN_WAIT; + haniwa->submenu_type = mSM_OVL_INVENTORY; + break; + } - case mChoice_CHOICE2: - { - action = aHNW_ACTION_TALK_WITH_MASTER2; - break; - } + case mChoice_CHOICE2: { + action = aHNW_ACTION_TALK_WITH_MASTER2; + break; + } - case mChoice_CHOICE3: - { - action = aHNW_ACTION_TALK_END_WAIT; - break; - } + case mChoice_CHOICE3: { + action = aHNW_ACTION_TALK_END_WAIT; + break; + } + } + + if (action != -1) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + aHNW_setupAction(actor, game, action); + } } - - if (action != -1) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - aHNW_setupAction(actor, game, action); - } - } } static void aHNW_talk_with_master2(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9) && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { - int action = -1; + if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9) && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { + int action = -1; - switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { - case mChoice_CHOICE0: - { - action = aHNW_ACTION_ROOF_CHECK; - break; - } + switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { + case mChoice_CHOICE0: { + action = aHNW_ACTION_ROOF_CHECK; + break; + } - case mChoice_CHOICE1: - { - action = aHNW_ACTION_MENU_OPEN_WAIT; - haniwa->submenu_type = mSM_OVL_HBOARD; - break; - } + case mChoice_CHOICE1: { + action = aHNW_ACTION_MENU_OPEN_WAIT; + haniwa->submenu_type = mSM_OVL_HBOARD; + break; + } - case mChoice_CHOICE2: - { - action = aHNW_ACTION_TALK_WITH_MASTER; - break; - } + case mChoice_CHOICE2: { + action = aHNW_ACTION_TALK_WITH_MASTER; + break; + } - case mChoice_CHOICE3: - { - action = aHNW_ACTION_TALK_END_WAIT; - break; - } + case mChoice_CHOICE3: { + action = aHNW_ACTION_TALK_END_WAIT; + break; + } + } + + if (action != -1) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + aHNW_setupAction(actor, game, action); + } } - - if (action != -1) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - aHNW_setupAction(actor, game, action); - } - } } static void aHNW_talk_end_wait(ACTOR* actor, GAME* game) { - if (mDemo_Check(mDemo_TYPE_TALK, actor) == FALSE) { - aHNW_setupAction(actor, game, aHNW_ACTION_DANCE); - } + if (mDemo_Check(mDemo_TYPE_TALK, actor) == FALSE) { + aHNW_setupAction(actor, game, aHNW_ACTION_DANCE); + } } static void aHNW_menu_open_wait(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (mMsg_Check_main_wait(msg_win) == TRUE) { - int submenu_type = haniwa->submenu_type; - Submenu* submenu = &play->submenu; - int arg1 = haniwa->house_idx; + if (mMsg_Check_main_wait(msg_win) == TRUE) { + int submenu_type = haniwa->submenu_type; + Submenu* submenu = &play->submenu; + int arg1 = haniwa->house_idx; - switch (submenu_type) { - case mSM_OVL_HBOARD: - { - mSM_open_submenu(submenu, mSM_OVL_HBOARD, 0, arg1); - break; - } + switch (submenu_type) { + case mSM_OVL_HBOARD: { + mSM_open_submenu(submenu, mSM_OVL_HBOARD, 0, arg1); + break; + } - case mSM_OVL_INVENTORY: - { - mSM_open_submenu(submenu, mSM_OVL_INVENTORY, 2, arg1); - break; - } + case mSM_OVL_INVENTORY: { + mSM_open_submenu(submenu, mSM_OVL_INVENTORY, 2, arg1); + break; + } - case mSM_OVL_NEEDLEWORK: - { - mSM_open_submenu(submenu, mSM_OVL_NEEDLEWORK, 0, arg1); - break; - } + case mSM_OVL_NEEDLEWORK: { + mSM_open_submenu(submenu, mSM_OVL_NEEDLEWORK, 0, arg1); + break; + } + } + + mMsg_ChangeMsgData(msg_win, 0x0927); + mMsg_Set_ForceNext(msg_win); + aHNW_setupAction(actor, game, aHNW_ACTION_MENU_END_WAIT); } - - mMsg_ChangeMsgData(msg_win, 0x0927); - mMsg_Set_ForceNext(msg_win); - aHNW_setupAction(actor, game, aHNW_ACTION_MENU_END_WAIT); - } } static void aHNW_menu_end_wait(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - Submenu* submenu = &play->submenu; - Submenu_Item_c* item; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + Submenu* submenu = &play->submenu; + Submenu_Item_c* item; - if (submenu->open_flag == FALSE) { - if (mMsg_Check_not_series_main_wait(mMsg_Get_base_window_p()) == TRUE) { - aHNW_setupAction(actor, game, aHNW_ACTION_TALK_WITH_MASTER); - switch (haniwa->submenu_type) { - case mSM_OVL_NEEDLEWORK: - { - Submenu_Item_c* item = submenu->item_p; - if (item->item == RSV_NO) { - Save_Get(homes[haniwa->house_idx]).door_original = mNW_get_image_no(submenu, item->slot_no); - sAdo_SysTrgStart(0x461); - } + if (submenu->open_flag == FALSE) { + if (mMsg_Check_not_series_main_wait(mMsg_Get_base_window_p()) == TRUE) { + aHNW_setupAction(actor, game, aHNW_ACTION_TALK_WITH_MASTER); + switch (haniwa->submenu_type) { + case mSM_OVL_NEEDLEWORK: { + Submenu_Item_c* item = submenu->item_p; + if (item->item == RSV_NO) { + Save_Get(homes[haniwa->house_idx]).door_original = mNW_get_image_no(submenu, item->slot_no); + sAdo_SysTrgStart(0x461); + } - break; + break; + } + } + + haniwa->submenu_type = mSM_OVL_NONE; } - } - - haniwa->submenu_type = mSM_OVL_NONE; } - } } static void aHNW_talk_with_guest(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 0)) { - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (mMsg_Check_MainNormalContinue(msg_win) == TRUE) { - int action = -1; + if (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 0)) { + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + if (mMsg_Check_MainNormalContinue(msg_win) == TRUE) { + int action = -1; - switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { - case mChoice_CHOICE0: - { - if (aHNW_check_keep_item(actor) == FALSE) { - mMsg_Set_continue_msg_num(msg_win, 0x092C); - action = aHNW_ACTION_TALK_END_WAIT; - } - else { - action = aHNW_ACTION_MENU_OPEN_WAIT_FOR_GUEST; - } - break; + switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { + case mChoice_CHOICE0: { + if (aHNW_check_keep_item(actor) == FALSE) { + mMsg_Set_continue_msg_num(msg_win, 0x092C); + action = aHNW_ACTION_TALK_END_WAIT; + } else { + action = aHNW_ACTION_MENU_OPEN_WAIT_FOR_GUEST; + } + break; + } + + case mChoice_CHOICE1: { + mMsg_Set_continue_msg_num(msg_win, 0x092A); + action = aHNW_ACTION_TALK_END_WAIT; + break; + } + } + + if (action != -1) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 0, 0); + aHNW_setupAction(actor, game, action); + } } - - case mChoice_CHOICE1: - { - mMsg_Set_continue_msg_num(msg_win, 0x092A); - action = aHNW_ACTION_TALK_END_WAIT; - break; - } - } - - if (action != -1) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 0, 0); - aHNW_setupAction(actor, game, action); - } } - } } static void aHNW_menu_open_wait_for_guest(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (mMsg_Check_main_wait(msg_win) == TRUE) { - mSM_open_submenu(&play->submenu, mSM_OVL_INVENTORY, 3, haniwa->house_idx); - mMsg_ChangeMsgData(msg_win, 0x092B); - aHNW_setupAction(actor, game, aHNW_ACTION_MENU_END_WAIT_FOR_GUEST); - } + if (mMsg_Check_main_wait(msg_win) == TRUE) { + mSM_open_submenu(&play->submenu, mSM_OVL_INVENTORY, 3, haniwa->house_idx); + mMsg_ChangeMsgData(msg_win, 0x092B); + aHNW_setupAction(actor, game, aHNW_ACTION_MENU_END_WAIT_FOR_GUEST); + } } static void aHNW_menu_end_wait_for_guest(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; - if (play->submenu.open_flag == FALSE && mMsg_Check_not_series_main_wait(mMsg_Get_base_window_p()) == TRUE) { - aHNW_setupAction(actor, game, aHNW_ACTION_TALK_END_WAIT); - } + if (play->submenu.open_flag == FALSE && mMsg_Check_not_series_main_wait(mMsg_Get_base_window_p()) == TRUE) { + aHNW_setupAction(actor, game, aHNW_ACTION_TALK_END_WAIT); + } } static void aHNW_save_check(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - int order_value = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); - int action = -1; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + int order_value = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); + int action = -1; - if (order_value && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { - switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { - case mChoice_CHOICE0: - { - action = aHNW_ACTION_SAVE_END_WAIT; - mBGMPsComp_scene_mode(13); - mDemo_Set_talk_return_demo_wait(1); - mPlib_Set_able_force_speak_label(actor); - break; - } + if (order_value && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { + switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { + case mChoice_CHOICE0: { + action = aHNW_ACTION_SAVE_END_WAIT; + mBGMPsComp_scene_mode(13); + mDemo_Set_talk_return_demo_wait(1); + mPlib_Set_able_force_speak_label(actor); + break; + } - case mChoice_CHOICE1: - { - action = aHNW_ACTION_TALK_WITH_MASTER; - break; - } + case mChoice_CHOICE1: { + action = aHNW_ACTION_TALK_WITH_MASTER; + break; + } + } + + if (action != -1) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + aHNW_setupAction(actor, game, action); + } } - - if (action != -1) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - aHNW_setupAction(actor, game, action); - } - } } static void aHNW_roof_check(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - int order_value = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); - int action = -1; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + int order_value = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); + int action = -1; - if (order_value && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { - switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { - case mChoice_CHOICE0: - { - action = aHNW_ACTION_MENU_OPEN_WAIT; - haniwa->submenu_type = mSM_OVL_NEEDLEWORK; - break; - } + if (order_value && mMsg_Check_MainNormalContinue(msg_win) == TRUE) { + switch (mChoice_Get_ChoseNum(mChoice_Get_base_window_p())) { + case mChoice_CHOICE0: { + action = aHNW_ACTION_MENU_OPEN_WAIT; + haniwa->submenu_type = mSM_OVL_NEEDLEWORK; + break; + } - case mChoice_CHOICE1: - { - Save_Get(homes[haniwa->house_idx]).door_original = 0xFF; - sAdo_SysTrgStart(0x461); - action = aHNW_ACTION_TALK_WITH_MASTER; - break; - } + case mChoice_CHOICE1: { + Save_Get(homes[haniwa->house_idx]).door_original = 0xFF; + sAdo_SysTrgStart(0x461); + action = aHNW_ACTION_TALK_WITH_MASTER; + break; + } - case mChoice_CHOICE2: - { - action = aHNW_ACTION_TALK_WITH_MASTER; - break; - } + case mChoice_CHOICE2: { + action = aHNW_ACTION_TALK_WITH_MASTER; + break; + } + } + + if (action != -1) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + aHNW_setupAction(actor, game, action); + } } - - if (action != -1) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - aHNW_setupAction(actor, game, action); - } - } } static void aHNW_save_end_wait(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - - if (haniwa->playing_save_bgm == FALSE && mMsg_Check_MainDisappear(mMsg_Get_base_window_p())) { - haniwa->playing_save_bgm = TRUE; - mBGMPsComp_make_ps_demo(0x41, 0x168); - } + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - if (mDemo_Check(mDemo_TYPE_TALK, actor) == FALSE) { - aHNW_setupAction(actor, game, aHNW_ACTION_PL_APPROACH_DOOR); - aHNW_set_save_permission(); - } + if (haniwa->playing_save_bgm == FALSE && mMsg_Check_MainDisappear(mMsg_Get_base_window_p())) { + haniwa->playing_save_bgm = TRUE; + mBGMPsComp_make_ps_demo(0x41, 0x168); + } + + if (mDemo_Check(mDemo_TYPE_TALK, actor) == FALSE) { + aHNW_setupAction(actor, game, aHNW_ACTION_PL_APPROACH_DOOR); + aHNW_set_save_permission(); + } } - static void aHNW_pl_approach_door(ACTOR* actor, GAME* game) { - static f32 chk_posX[mHS_HOUSE_NUM] = { 2095.0f, 2385.0f, 2095.0f, 2385.0f }; - static f32 chk_val[mHS_HOUSE_NUM] = { 1.0f, -1.0f, 1.0f, -1.0f }; - static xyz_t goal_pos[mHS_HOUSE_NUM][2] = { - { - { 2098.0f, 0.0f, 1540.0f }, - { 2110.0f, 0.0f, 1474.0f } - }, - { - { 2382.0f, 0.0f, 1540.0f }, - { 2369.0f, 0.0f, 1474.0f } - }, - { - { 2098.0f, 0.0f, 1820.0f }, - { 2110.0f, 0.0f, 1755.0f } - }, - { - { 2382.0f, 0.0f, 1820.0f }, - { 2369.0f, 0.0f, 1755.0f } + static f32 chk_posX[mHS_HOUSE_NUM] = { 2095.0f, 2385.0f, 2095.0f, 2385.0f }; + static f32 chk_val[mHS_HOUSE_NUM] = { 1.0f, -1.0f, 1.0f, -1.0f }; + static xyz_t goal_pos[mHS_HOUSE_NUM][2] = { { { 2098.0f, 0.0f, 1540.0f }, { 2110.0f, 0.0f, 1474.0f } }, + { { 2382.0f, 0.0f, 1540.0f }, { 2369.0f, 0.0f, 1474.0f } }, + { { 2098.0f, 0.0f, 1820.0f }, { 2110.0f, 0.0f, 1755.0f } }, + { { 2382.0f, 0.0f, 1820.0f }, { 2369.0f, 0.0f, 1755.0f } } }; + + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + PLAYER_ACTOR* player = get_player_actor_withoutCheck((GAME_PLAY*)game); + + haniwa->door_approach_frame++; + + if (player != NULL) { + int house_idx = haniwa->house_idx; + int stage = ((chk_posX[house_idx] - player->actor_class.world.position.x) * chk_val[house_idx]) <= 0.0f; + xyz_t* goal = goal_pos[house_idx] + stage; + + if (haniwa->player_approach_door_stage != stage && + mPlib_request_main_demo_walk_type1(game, goal->x, goal->z, 3.0f, FALSE)) { + haniwa->player_approach_door_stage = stage; + } + + mPlib_Set_goal_player_demo_walk(goal->x, goal->z, 3.0f); + + if (haniwa->door_approach_frame > 160) { + MY_HOUSE_ACTOR* house_actor = (MY_HOUSE_ACTOR*)Actor_info_fgName_search( + &play->actor_info, HOUSE0 + haniwa->house_idx, ACTOR_PART_ITEM); + + if (house_actor != NULL) { + house_actor->structure_class.actor_class.world.angle.z = 1; + aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); + } + } else if (stage == 1 && search_position_distanceXZ(goal, &player->actor_class.world.position) < 3.0f) { + aHNW_setupAction(actor, game, aHNW_ACTION_DOOR_OPEN_WAIT); + } } - }; - - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - PLAYER_ACTOR* player = get_player_actor_withoutCheck((GAME_PLAY*)game); - - haniwa->door_approach_frame++; - - if (player != NULL) { - int house_idx = haniwa->house_idx; - int stage = ((chk_posX[house_idx] - player->actor_class.world.position.x) * chk_val[house_idx]) <= 0.0f; - xyz_t* goal = goal_pos[house_idx] + stage; - - if (haniwa->player_approach_door_stage != stage && mPlib_request_main_demo_walk_type1(game, goal->x, goal->z, 3.0f, FALSE)) { - haniwa->player_approach_door_stage = stage; - } - - mPlib_Set_goal_player_demo_walk(goal->x, goal->z, 3.0f); - - if (haniwa->door_approach_frame > 160) { - MY_HOUSE_ACTOR* house_actor = (MY_HOUSE_ACTOR*)Actor_info_fgName_search(&play->actor_info, HOUSE0 + haniwa->house_idx, ACTOR_PART_ITEM); - - if (house_actor != NULL) { - house_actor->actor_class.world.angle.z = 1; - aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); - } - } - else if (stage == 1 && search_position_distanceXZ(goal, &player->actor_class.world.position) < 3.0f) { - aHNW_setupAction(actor, game, aHNW_ACTION_DOOR_OPEN_WAIT); - } - } } static void aHNW_door_open_wait(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - MY_HOUSE_ACTOR* house_actor = (MY_HOUSE_ACTOR*)Actor_info_fgName_search(&play->actor_info, HOUSE0 + haniwa->house_idx, ACTOR_PART_ITEM); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + MY_HOUSE_ACTOR* house_actor = + (MY_HOUSE_ACTOR*)Actor_info_fgName_search(&play->actor_info, HOUSE0 + haniwa->house_idx, ACTOR_PART_ITEM); - if (house_actor != NULL) { - house_actor->door_rotation_speed_idx = 6; // TODO: this is probably an enum - if (house_actor != get_player_actor_withoutCheck((GAME_PLAY*)gamePT)->get_door_label_proc(gamePT)) { - aHNW_setupAction(actor, game, aHNW_ACTION_DOOR_OPEN_TIMER); - haniwa->door_approach_frame = 0; + if (house_actor != NULL) { + house_actor->structure_class.request_type = 6; // TODO: this is probably an enum + if (house_actor != get_player_actor_withoutCheck((GAME_PLAY*)gamePT)->get_door_label_proc(gamePT)) { + aHNW_setupAction(actor, game, aHNW_ACTION_DOOR_OPEN_TIMER); + haniwa->door_approach_frame = 0; + } else { + aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); + } } - else { - aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); - } - } } static void aHNW_door_open_timer(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - MY_HOUSE_ACTOR* house_actor = (MY_HOUSE_ACTOR*)Actor_info_fgName_search(&play->actor_info, HOUSE0 + haniwa->house_idx, ACTOR_PART_ITEM); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + MY_HOUSE_ACTOR* house_actor = + (MY_HOUSE_ACTOR*)Actor_info_fgName_search(&play->actor_info, HOUSE0 + haniwa->house_idx, ACTOR_PART_ITEM); - if (house_actor != NULL) { - if (house_actor == get_player_actor_withoutCheck((GAME_PLAY*)gamePT)->get_door_label_proc(gamePT)) { - aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); + if (house_actor != NULL) { + if (house_actor == get_player_actor_withoutCheck((GAME_PLAY*)gamePT)->get_door_label_proc(gamePT)) { + aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); + } else { + haniwa->door_approach_frame++; + if (haniwa->door_approach_frame > 80) { + house_actor->structure_class.actor_class.world.angle.z = 1; + aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); + } + } } - else { - haniwa->door_approach_frame++; - if (haniwa->door_approach_frame > 80) { - house_actor->actor_class.world.angle.z = 1; - aHNW_setupAction(actor, game, aHNW_ACTION_WAIT); - } - } - } } static void aHNW_menu_open_wait_init(ACTOR* actor, GAME* game) { - mMsg_request_main_disappear_wait_type1(mMsg_Get_base_window_p()); + mMsg_request_main_disappear_wait_type1(mMsg_Get_base_window_p()); } static void aHNW_menu_end_wait_init(ACTOR* actor, GAME* game) { - mMsg_request_main_appear_wait_type1(mMsg_Get_base_window_p()); + mMsg_request_main_appear_wait_type1(mMsg_Get_base_window_p()); } static void aHNW_talk_with_guest_init(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - - mMsg_Set_free_str(mMsg_Get_base_window_p(), 2, Save_Get(homes[haniwa->house_idx]).ownerID.player_name, PLAYER_NAME_LEN); + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + + mMsg_Set_free_str(mMsg_Get_base_window_p(), 2, Save_Get(homes[haniwa->house_idx]).ownerID.player_name, + PLAYER_NAME_LEN); } static void aHNW_pl_approach_door_init(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - game->pad_initialized = FALSE; - haniwa->player_approach_door_stage = -1; - haniwa->door_approach_frame = 0; + game->pad_initialized = FALSE; + haniwa->player_approach_door_stage = -1; + haniwa->door_approach_frame = 0; } typedef void (*HANIWA_PROC)(ACTOR*, GAME*); static void aHNW_init_proc(ACTOR* actor, GAME* game, int action) { - static HANIWA_PROC init_proc[aHNW_ACTION_NUM] = { - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - &aHNW_menu_open_wait_init, - &aHNW_menu_end_wait_init, - &aHNW_talk_with_guest_init, - &aHNW_menu_open_wait_init, - &aHNW_menu_end_wait_init, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1, - &aHNW_pl_approach_door_init, - (HANIWA_PROC)&none_proc1, - (HANIWA_PROC)&none_proc1 - }; + static HANIWA_PROC init_proc[aHNW_ACTION_NUM] = { + (HANIWA_PROC)&none_proc1, (HANIWA_PROC)&none_proc1, (HANIWA_PROC)&none_proc1, (HANIWA_PROC)&none_proc1, + (HANIWA_PROC)&none_proc1, (HANIWA_PROC)&none_proc1, &aHNW_menu_open_wait_init, &aHNW_menu_end_wait_init, + &aHNW_talk_with_guest_init, &aHNW_menu_open_wait_init, &aHNW_menu_end_wait_init, (HANIWA_PROC)&none_proc1, + (HANIWA_PROC)&none_proc1, (HANIWA_PROC)&none_proc1, &aHNW_pl_approach_door_init, (HANIWA_PROC)&none_proc1, + (HANIWA_PROC)&none_proc1 + }; - (*init_proc[action])(actor, game); + (*init_proc[action])(actor, game); } static void aHNW_setupAction(ACTOR* actor, GAME* game, int action) { - static HANIWA_PROC process[aHNW_ACTION_NUM] = { - &aHNW_wait, - &aHNW_dance, - &aHNW_check_proceeds, - &aHNW_talk_with_master, - &aHNW_talk_with_master2, - &aHNW_talk_end_wait, - &aHNW_menu_open_wait, - &aHNW_menu_end_wait, - &aHNW_talk_with_guest, - &aHNW_menu_open_wait_for_guest, - &aHNW_menu_end_wait_for_guest, - &aHNW_roof_check, - &aHNW_save_check, - &aHNW_save_end_wait, - &aHNW_pl_approach_door, - &aHNW_door_open_wait, - &aHNW_door_open_timer - }; + static HANIWA_PROC process[aHNW_ACTION_NUM] = { &aHNW_wait, + &aHNW_dance, + &aHNW_check_proceeds, + &aHNW_talk_with_master, + &aHNW_talk_with_master2, + &aHNW_talk_end_wait, + &aHNW_menu_open_wait, + &aHNW_menu_end_wait, + &aHNW_talk_with_guest, + &aHNW_menu_open_wait_for_guest, + &aHNW_menu_end_wait_for_guest, + &aHNW_roof_check, + &aHNW_save_check, + &aHNW_save_end_wait, + &aHNW_pl_approach_door, + &aHNW_door_open_wait, + &aHNW_door_open_timer }; - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - int house_idx = haniwa->house_idx; - int animation_state = haniwa->animation_state; - int no_owner = mPr_NullCheckPersonalID(&Save_Get(homes[house_idx]).ownerID); - int owner_is_player = mHS_get_pl_no(house_idx) == Common_Get(player_no); + int house_idx = haniwa->house_idx; + int animation_state = haniwa->animation_state; + int no_owner = mPr_NullCheckPersonalID(&Save_Get(homes[house_idx]).ownerID); + int owner_is_player = mHS_get_pl_no(house_idx) == Common_Get(player_no); - haniwa->action = action; - haniwa->action_proc = process[action]; + haniwa->action = action; + haniwa->action_proc = process[action]; - if (action >= aHNW_ACTION_CHECK_PROCEEDS) { - haniwa->anim_frame_speed = 0.3f; - } - else { - if (no_owner) { - if (haniwa->anim_frame_speed != 0.0f) { - haniwa->anim_frame_speed = 0.075f; - } - } - else { - if (owner_is_player) { - if (action == aHNW_ACTION_WAIT || action == aHNW_ACTION_DOOR_OPEN_TIMER) { - haniwa->anim_frame_speed = 0.3f; + if (action >= aHNW_ACTION_CHECK_PROCEEDS) { + haniwa->anim_frame_speed = 0.3f; + } else { + if (no_owner) { + if (haniwa->anim_frame_speed != 0.0f) { + haniwa->anim_frame_speed = 0.075f; + } + } else { + if (owner_is_player) { + if (action == aHNW_ACTION_WAIT || action == aHNW_ACTION_DOOR_OPEN_TIMER) { + haniwa->anim_frame_speed = 0.3f; + } else { + haniwa->anim_frame_speed = 0.45f; + } + } else { + haniwa->anim_frame_speed = 0.1f; + } } - else { - haniwa->anim_frame_speed = 0.45f; - } - } - else { - haniwa->anim_frame_speed = 0.1f; - } } - } - if (animation_state == 2) { - cKF_SkeletonInfo_R_init( - &haniwa->keyframe, haniwa->keyframe.skeleton, &cKF_ba_r_hnw_move, - 1.0f, 9.0f, 1.0f, haniwa->anim_frame_speed, 0.0f, - cKF_FRAMECONTROL_REPEAT, - NULL - ); - haniwa->saved_current_frame = haniwa->keyframe.frame_control.current_frame; - } + if (animation_state == 2) { + cKF_SkeletonInfo_R_init(&haniwa->keyframe, haniwa->keyframe.skeleton, &cKF_ba_r_hnw_move, 1.0f, 9.0f, 1.0f, + haniwa->anim_frame_speed, 0.0f, cKF_FRAMECONTROL_REPEAT, NULL); + haniwa->saved_current_frame = haniwa->keyframe.frame_control.current_frame; + } - haniwa->animation_state = 0; - aHNW_init_proc(actor, game, action); - if (no_owner && action < aHNW_ACTION_CHECK_PROCEEDS) { - haniwa->keyframe.frame_control.mode = cKF_FRAMECONTROL_STOP; - } - else { - haniwa->keyframe.frame_control.mode = cKF_FRAMECONTROL_REPEAT; - } + haniwa->animation_state = 0; + aHNW_init_proc(actor, game, action); + if (no_owner && action < aHNW_ACTION_CHECK_PROCEEDS) { + haniwa->keyframe.frame_control.mode = cKF_FRAMECONTROL_STOP; + } else { + haniwa->keyframe.frame_control.mode = cKF_FRAMECONTROL_REPEAT; + } } static void aHNW_common_process(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - cKF_SkeletonInfo_R_c* keyframe = &haniwa->keyframe; - int house_idx = haniwa->house_idx; - int no_owner = mPr_NullCheckPersonalID(&Save_Get(homes[house_idx]).ownerID); - f32 target; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + cKF_SkeletonInfo_R_c* keyframe = &haniwa->keyframe; + int house_idx = haniwa->house_idx; + int no_owner = mPr_NullCheckPersonalID(&Save_Get(homes[house_idx]).ownerID); + f32 target; - if (no_owner == FALSE && keyframe->frame_control.mode == cKF_FRAMECONTROL_STOP) { - aHNW_setupAction((ACTOR*)haniwa, game, haniwa->action); - keyframe->frame_control.mode = cKF_FRAMECONTROL_REPEAT; - } - else if (no_owner && haniwa->action < 2 && keyframe->frame_control.speed <= 0.1f) { - keyframe->frame_control.mode = cKF_FRAMECONTROL_STOP; - } - else { - keyframe->frame_control.mode = cKF_FRAMECONTROL_REPEAT; - } - - if (no_owner == FALSE || haniwa->action >= aHNW_ACTION_CHECK_PROCEEDS) { - aHNW_search_player((ACTOR*)haniwa); - } - else { - aHNW_search_front((ACTOR*)haniwa, house_idx); - } - - target = haniwa->anim_frame_speed; - - { - if (target > keyframe->frame_control.speed) { - chase_f(&keyframe->frame_control.speed, target, 0.05f); + if (no_owner == FALSE && keyframe->frame_control.mode == cKF_FRAMECONTROL_STOP) { + aHNW_setupAction((ACTOR*)haniwa, game, haniwa->action); + keyframe->frame_control.mode = cKF_FRAMECONTROL_REPEAT; + } else if (no_owner && haniwa->action < 2 && keyframe->frame_control.speed <= 0.1f) { + keyframe->frame_control.mode = cKF_FRAMECONTROL_STOP; + } else { + keyframe->frame_control.mode = cKF_FRAMECONTROL_REPEAT; } - else { - chase_f(&keyframe->frame_control.speed, target, 0.015f); + + if (no_owner == FALSE || haniwa->action >= aHNW_ACTION_CHECK_PROCEEDS) { + aHNW_search_player((ACTOR*)haniwa); + } else { + aHNW_search_front((ACTOR*)haniwa, house_idx); + } + + target = haniwa->anim_frame_speed; + + { + if (target > keyframe->frame_control.speed) { + chase_f(&keyframe->frame_control.speed, target, 0.05f); + } else { + chase_f(&keyframe->frame_control.speed, target, 0.015f); + } } - } } static void aHNW_actor_move(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; - cKF_SkeletonInfo_R_c* keyframe = &haniwa->keyframe; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + cKF_SkeletonInfo_R_c* keyframe = &haniwa->keyframe; - haniwa->keyframe_state = cKF_SkeletonInfo_R_play(keyframe); - (*haniwa->action_proc)((ACTOR*)haniwa, game); - aHNW_common_process(actor, game); - CollisionCheck_Uty_ActorWorldPosSetPipeC(actor, &haniwa->col_pipe); - CollisionCheck_setOC(game, &play->collision_check, &haniwa->col_pipe.collision_obj); - Actor_world_to_eye(actor, 50.0f); + haniwa->keyframe_state = cKF_SkeletonInfo_R_play(keyframe); + (*haniwa->action_proc)((ACTOR*)haniwa, game); + aHNW_common_process(actor, game); + CollisionCheck_Uty_ActorWorldPosSetPipeC(actor, &haniwa->col_pipe); + CollisionCheck_setOC(game, &play->collision_check, &haniwa->col_pipe.collision_obj); + Actor_world_to_eye(actor, 50.0f); } static void aHNW_actor_init(ACTOR* actor, GAME* game) { - HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; - int house_idx = haniwa->house_idx; + HANIWA_ACTOR* haniwa = (HANIWA_ACTOR*)actor; + int house_idx = haniwa->house_idx; - mFI_SetFG_common((mActor_name_t)(house_idx + DUMMY_HANIWA0), actor->world.position, FALSE); - actor->mv_proc = &aHNW_actor_move; - actor->dw_proc = &aHNW_actor_draw; - aHNW_setupAction((ACTOR*)haniwa, game, aHNW_ACTION_WAIT); // weird that we have to re-cast to ACTOR so fequently for matches - haniwa->keyframe.morph_counter = 0.0f; - aHNW_actor_move(actor, game); + mFI_SetFG_common((mActor_name_t)(house_idx + DUMMY_HANIWA0), actor->world.position, FALSE); + actor->mv_proc = &aHNW_actor_move; + actor->dw_proc = &aHNW_actor_draw; + aHNW_setupAction((ACTOR*)haniwa, game, + aHNW_ACTION_WAIT); // weird that we have to re-cast to ACTOR so fequently for matches + haniwa->keyframe.morph_counter = 0.0f; + aHNW_actor_move(actor, game); } diff --git a/src/ac_my_house.c b/src/ac_my_house.c new file mode 100644 index 00000000..a6bc4128 --- /dev/null +++ b/src/ac_my_house.c @@ -0,0 +1,212 @@ +#include "ac_my_house.h" + +#include "m_name_table.h" +#include "bg_item_h.h" +#include "m_common_data.h" +#include "m_house.h" +#include "m_player_lib.h" +#include "m_demo.h" +#include "ac_intro_demo.h" +#include "m_bgm.h" +#include "sys_matrix.h" +#include "m_rcp.h" +#include "libforest/gbi_extensions.h" + +enum { + aMHS_ACTION_WAIT, + aMHS_ACTION_OPEN_DOOR_WAIT, + aMHS_ACTION_OPEN_DOOR, + aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT, + + aMHS_ACTION_NUM +}; + +static void aMHS_actor_ct(ACTOR*, GAME*); +static void aMHS_actor_dt(ACTOR*, GAME*); +static void aMHS_actor_init(ACTOR*, GAME*); +static void aMHS_actor_draw(ACTOR*, GAME*); + +static int aMHS_light_ctrl(STRUCTURE_ACTOR* my_house); +static void aMHS_setup_action(STRUCTURE_ACTOR* my_house, int action); +static void aMHS_setup_animation(STRUCTURE_ACTOR* my_house, f32 speed); +static void aMHS_set_bgOffset(ACTOR* actorx, int flag); + +ACTOR_PROFILE MyHouse_Profile = { + mAc_PROFILE_MYHOUSE, + ACTOR_PART_ITEM, + ACTOR_STATE_NONE, + HOUSE0, + ACTOR_OBJ_BANK_KEEP, + sizeof(MY_HOUSE_ACTOR), + &aMHS_actor_ct, + &aMHS_actor_dt, + &aMHS_actor_init, + &aMHS_actor_draw, + NULL, +}; + +static u8 aMHS_lv1_shadowE_vtx_fix_flg_table[] = { + FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, +}; + +static u8 aMHS_lv1_shadowW_vtx_fix_flg_table[] = { + TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, +}; + +extern Vtx obj_myhome1_shadowE_v[]; +extern Gfx obj_myhome1_shadowET_model[]; + +static bIT_ShadowData_c aMHS_lv1_shadowE_data = { + 18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome1_shadowE_v, obj_myhome1_shadowET_model, +}; + +extern Vtx obj_myhome1_shadowW_v[]; +extern Gfx obj_myhome1_shadowWT_model[]; + +static bIT_ShadowData_c aMHS_lv1_shadowW_data = { + 18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome1_shadowW_v, obj_myhome1_shadowWT_model, +}; + +static bIT_ShadowData_c* aMHS_lv1_shadow_data[2] = { &aMHS_lv1_shadowW_data, &aMHS_lv1_shadowE_data }; + +extern Vtx obj_myhome2_shadowE_v[]; +extern Gfx obj_myhome2_shadowET_model[]; + +static bIT_ShadowData_c aMHS_lv2_shadowE_data = { + 18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome2_shadowE_v, obj_myhome2_shadowET_model, +}; + +extern Vtx obj_myhome2_shadowW_v[]; +extern Gfx obj_myhome2_shadowWT_model[]; + +static bIT_ShadowData_c aMHS_lv2_shadowW_data = { + 18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome2_shadowW_v, obj_myhome2_shadowWT_model, +}; + +static bIT_ShadowData_c* aMHS_lv2_shadow_data[2] = { &aMHS_lv2_shadowW_data, &aMHS_lv2_shadowE_data }; + +extern Vtx obj_myhome3_shadowE_v[]; +extern Gfx obj_myhome3_shadowET_model[]; + +static bIT_ShadowData_c aMHS_lv3_shadowE_data = { + 18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome3_shadowE_v, obj_myhome3_shadowET_model, +}; + +extern Vtx obj_myhome3_shadowW_v[]; +extern Gfx obj_myhome3_shadowWT_model[]; + +static bIT_ShadowData_c aMHS_lv3_shadowW_data = { + 18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome3_shadowW_v, obj_myhome3_shadowWT_model, +}; + +static bIT_ShadowData_c* aMHS_lv3_shadow_data[2] = { &aMHS_lv3_shadowW_data, &aMHS_lv3_shadowE_data }; + +extern Vtx obj_myhome4_shadowE_v[]; +extern Gfx obj_myhome4_shadowET_model[]; + +static bIT_ShadowData_c aMHS_lv4_shadowE_data = { + 18, aMHS_lv1_shadowE_vtx_fix_flg_table, 60.0f, obj_myhome4_shadowE_v, obj_myhome4_shadowET_model, +}; + +extern Vtx obj_myhome4_shadowW_v[]; +extern Gfx obj_myhome4_shadowWT_model[]; + +static bIT_ShadowData_c aMHS_lv4_shadowW_data = { + 18, aMHS_lv1_shadowW_vtx_fix_flg_table, 60.0f, obj_myhome4_shadowW_v, obj_myhome4_shadowWT_model, +}; + +static bIT_ShadowData_c* aMHS_lv4_shadow_data[2] = { &aMHS_lv4_shadowW_data, &aMHS_lv4_shadowE_data }; + +static f32 aMHS_posX_table[2] = { 20.0f, -20.0f }; + +static int aMHS_door_closed_flag[mHm_HOMESIZE_NUM - 1]; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome1; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome1; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome2; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome2; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome3; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome3; + +extern cKF_Skeleton_R_c cKF_bs_r_obj_s_myhome4; +extern cKF_Skeleton_R_c cKF_bs_r_obj_w_myhome4; + +static void aMHS_actor_ct(ACTOR* actorx, GAME* game) { + static cKF_Skeleton_R_c* skl[mHm_HOMESIZE_NUM - 1][2] = { + { &cKF_bs_r_obj_s_myhome1, &cKF_bs_r_obj_w_myhome1 }, + { &cKF_bs_r_obj_s_myhome2, &cKF_bs_r_obj_w_myhome2 }, + { &cKF_bs_r_obj_s_myhome3, &cKF_bs_r_obj_w_myhome3 }, + { &cKF_bs_r_obj_s_myhome4, &cKF_bs_r_obj_w_myhome4 }, + }; + + static s16 angle_table[2] = { DEG2SHORT_ANGLE(90.0f), DEG2SHORT_ANGLE(0.0f) }; + + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx; + int house_idx = actorx->npc_id - HOUSE0; + int side_idx = house_idx & 1; + int size = Save_Get(homes[house_idx]).size_info.size; + int season; + s16 param_2 = 50; + + my_house->season = Common_Get(time.season); + season = my_house->season == mTM_SEASON_WINTER; + + if (size != mHm_HOMESIZE_UPPER) { + param_2 = 5 + size; + } + + cKF_SkeletonInfo_R_ct(&my_house->keyframe, skl[size][season], NULL, my_house->work_area, my_house->morph_area); + my_house->action = house_idx; + my_house->arg0 = size; + my_house->arg2 = param_2; + my_house->arg1 = Save_Get(homes[house_idx]).outlook_pal; + my_house->arg1 += aSTR_PAL_MYHOME_A; + actorx->world.position.x += aMHS_posX_table[side_idx]; + actorx->world.position.z += 20.0f; + + // arg0_f = x pos + 2 * posX_table, arg1_f = z pos + 40.0f + my_house->arg0_f = actorx->world.position.x; + my_house->arg0_f += aMHS_posX_table[side_idx]; + my_house->arg1_f = actorx->world.position.z + 20.0f; + + my_house->arg3 = mEv_CheckFirstIntro() != FALSE; + + if (aMHS_light_ctrl(my_house) != FALSE) { + actorx->world.angle.x = DEG2SHORT_ANGLE(90.0f) - 1; // 0x3FFF + } else { + actorx->world.angle.x = DEG2SHORT_ANGLE(0.0f); + } + + actorx->shape_info.rotation.y = angle_table[side_idx]; + actorx->world.angle.z = DEG2SHORT_ANGLE(0.0f); + actorx->cull_width = 450.0f; + actorx->cull_radius = 450.0f; + + if (mPr_CheckFishCompleteTalk(mHS_get_pl_no(house_idx))) { + actorx->speed = TRUE; // Store fish weathervane bool as... speed? + } + + if (mPr_CheckInsectCompleteTalk(mHS_get_pl_no(house_idx))) { + actorx->gravity = TRUE; // Store insect plaque bool as... gravity? + } + + aMHS_setup_action(my_house, aMHS_ACTION_WAIT); + aMHS_setup_animation(my_house, 0.0f); + cKF_SkeletonInfo_R_play(&my_house->keyframe); + aMHS_set_bgOffset(actorx, 1); + aMHS_door_closed_flag[my_house->arg0] = TRUE; +} + +static void aMHS_actor_dt(ACTOR* actorx, GAME* game) { + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx; + int house_idx = actorx->npc_id - HOUSE0; + + cKF_SkeletonInfo_R_dt(&my_house->keyframe); + actorx->world.position.x -= aMHS_posX_table[house_idx & 1]; + actorx->world.position.z -= 20.0f; +} + +#include "../src/ac_my_house_move.c_inc" +#include "../src/ac_my_house_draw.c_inc" diff --git a/src/ac_my_house_draw.c_inc b/src/ac_my_house_draw.c_inc new file mode 100644 index 00000000..2e18f5fe --- /dev/null +++ b/src/ac_my_house_draw.c_inc @@ -0,0 +1,260 @@ +static int aMHS_actor_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, + u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) { + static s16 angle_table[2] = { DEG2SHORT_ANGLE(0.0f), DEG2SHORT_ANGLE(90.0f) }; + GRAPH* graph = game->graph; + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)arg; + int l; + int r; + int g; + int b; + int a; + Gfx* gfx; + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + if (joint_idx == 8) { + int angle = my_house->actor_class.world.angle.x; + + if (angle == (DEG2SHORT_ANGLE(90.0f) - 1)) { + l = 120; + r = 255; + g = 255; + b = 150; + a = 255; + } else if (angle == DEG2SHORT_ANGLE(0.0f)) { + l = 0; + r = 0; + g = 0; + b = 0; + a = 255; + } else { + f32 inter = (f32)angle * (1.0f / 16383.0f); // approx (1.0f / (f32)DEG2SHORT_ANGLE(90.0f) + + l = inter * 120.0f; + r = inter * 255.0f; + g = inter * 255.0f; + b = inter * 150.0f; + a = 255; + } + + gDPSetPrimColor(gfx++, 0, l, r, g, b, a); + } else if (joint_idx == 12) { + *joint_shape = NULL; // Don't draw window frame shadow yet + } else if (joint_idx == 3 || joint_idx == 5) { + int draw_comp_fish = my_house->actor_class.speed; + + if (draw_comp_fish) { + s16 angle = (s16)(joint_idx == 3 ? mEnv_GetWindAngleS() : my_house->actor_class.actor_specific); + + if (joint_idx == 3) { + angle += angle_table[my_house->action & 1]; // rotate based on side house is on + } + + if (my_house->arg0 == 0) { + Matrix_RotateY(angle, 1); + } else { + Matrix_RotateX(angle, 1); + } + + if (my_house->arg0 == 1) { + Matrix_RotateZ(DEG2SHORT_ANGLE(-90.0f), 1); + } + } else { + *joint_shape = NULL; // do not draw fish decoration joints + } + } else if (joint_idx == 1) { + int draw_comp_insect = my_house->actor_class.gravity; + + if (draw_comp_insect == FALSE) { + *joint_shape = NULL; // do not draw insect decoration joint + } + } else if (joint_idx == 6 && aMHS_door_closed_flag[my_house->arg0]) { + joint_rot->y = DEG2SHORT_ANGLE(-89.895630f); // draw door shut + } + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); + + return TRUE; +} + +extern Gfx obj_s_myhome1_window_model[]; +extern Gfx obj_w_myhome1_window_model[]; + +extern Gfx obj_s_myhome2_window_model[]; +extern Gfx obj_w_myhome2_window_model[]; + +extern Gfx obj_s_myhome3_window_model[]; +extern Gfx obj_w_myhome3_window_model[]; + +extern Gfx obj_s_myhome4_window_model[]; +extern Gfx obj_w_myhome4_window_model[]; + +static int aMHS_actor_draw_after(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, + u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) { + static Gfx* mdl[mHm_HOMESIZE_NUM - 1][2] = { + { obj_s_myhome1_window_model, obj_w_myhome1_window_model }, + { obj_s_myhome2_window_model, obj_w_myhome2_window_model }, + { obj_s_myhome3_window_model, obj_w_myhome3_window_model }, + { obj_s_myhome4_window_model, obj_w_myhome4_window_model }, + }; + + GRAPH* graph = game->graph; + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)arg; + u32 season; + int l; + int r; + int g; + int b; + int a; + Mtx* mtx; + Gfx* gfx; + + // Draw window frame shadow last + if (joint_idx == 12) { + mtx = _Matrix_to_Mtx_new(graph); + + if (mtx != NULL) { + int angle = my_house->actor_class.world.angle.x; + + if (angle == (DEG2SHORT_ANGLE(90.0f) - 1)) { + l = 120; + r = 255; + g = 255; + b = 150; + a = 255; + } else if (angle == DEG2SHORT_ANGLE(0.0f)) { + l = 0; + r = 0; + g = 0; + b = 0; + a = 255; + } else { + f32 inter = (f32)angle * (1.0f / 16383.0f); // approx (1.0f / (f32)DEG2SHORT_ANGLE(90.0f) + + l = inter * 120.0f; + r = 255; + g = 255; + b = 150; + a = 255; + } + + season = my_house->season == mTM_SEASON_WINTER; + _texture_z_light_fog_prim_shadow(graph); + + OPEN_DISP(graph); + gfx = NOW_SHADOW_DISP; + + gDPSetPrimColor(gfx++, 0, l, r, g, b, a); + gSPMatrix(gfx++, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, mdl[my_house->arg0][season]); + + SET_SHADOW_DISP(gfx); + CLOSE_DISP(graph); + } + } + + return TRUE; +} + +static void aMHS_actor_draw_ta_set(STRUCTURE_ACTOR* my_house, GAME* game) { + static u8 edge_alpha[mHm_HOMESIZE_NUM - 1] = { 96, 64, 112, 96 }; + GRAPH* graph = game->graph; + + OPEN_DISP(graph); + + gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_DOLPHIN); + gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, G_TA_DOLPHIN); + gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, edge_alpha[my_house->arg0]); + gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, edge_alpha[my_house->arg0]); + + CLOSE_DISP(graph); +} + +static void aMHS_actor_draw_ta_clr(STRUCTURE_ACTOR* my_house, GAME* game) { + GRAPH* graph = game->graph; + + OPEN_DISP(graph); + + gDPSetTextureAdjustMode(NEXT_POLY_OPA_DISP, G_TA_N64); + gDPSetTextureAdjustMode(NEXT_SHADOW_DISP, G_TA_N64); + gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, 144); + gDPSetTexEdgeAlpha(NEXT_SHADOW_DISP, 144); + + CLOSE_DISP(graph); +} + +extern u8 obj_myhome_mark_tex_txt[]; +extern u16 obj_myhome_mark_pal[]; + +static int aMHS_actor_draw_before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, + u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos); +static int aMHS_actor_draw_after(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, + u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos); + +static void aMHS_actor_draw_ta_set(STRUCTURE_ACTOR* my_house, GAME* game); +static void aMHS_actor_draw_ta_clr(STRUCTURE_ACTOR* my_house, GAME* game); + +extern u8 obj_myhome_mark_tex_txt[]; +extern u16 obj_myhome_mark_pal[]; + +static void aMHS_actor_draw(ACTOR* actorx, GAME* game) { + static bIT_ShadowData_c** shadow_data[mHm_HOMESIZE_NUM - 1] = { + aMHS_lv1_shadow_data, + aMHS_lv2_shadow_data, + aMHS_lv3_shadow_data, + aMHS_lv4_shadow_data, + }; + + GRAPH* graph; + cKF_SkeletonInfo_R_c* keyframe; + Mtx* mtx; + int door_original; + int pl_no; + bIT_ShadowData_c** shadow_data_pp; + Gfx* gfx; + GAME_PLAY* play; + STRUCTURE_ACTOR* my_house; + + play = (GAME_PLAY*)game; + graph = play->game.graph; + my_house = (STRUCTURE_ACTOR*)actorx; + keyframe = &my_house->keyframe; + door_original = Save_Get(homes[my_house->action]).door_original; + pl_no = mHS_get_pl_no_detail(my_house->action); + mtx = GRAPH_ALLOC_TYPE(graph, Mtx, keyframe->skeleton->num_shown_joints); + + if (mtx != NULL) { + aMHS_actor_draw_ta_set(my_house, (GAME*)play); + _texture_z_light_fog_prim(graph); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPSegment(gfx++, G_MWO_SEGMENT_8, (*Common_Get(clip).structure_clip->get_pal_segment_proc)(my_house->arg1)); + + if (door_original == 0xFF || pl_no == -1) { + gSPSegment(gfx++, G_MWO_SEGMENT_9, obj_myhome_mark_tex_txt); + gSPSegment(gfx++, G_MWO_SEGMENT_A, obj_myhome_mark_pal); + } else { + int org_idx = door_original & 7; + u16* pal = mNW_PaletteIdx2Palette(Save_Get(private[pl_no]).my_org[org_idx].palette); + u8* tex = Save_Get(private[pl_no]).my_org[org_idx].design.data; + + gSPSegment(gfx++, G_MWO_SEGMENT_9, tex); + gSPSegment(gfx++, G_MWO_SEGMENT_A, pal); + } + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); + + cKF_Si3_draw_R_SV((GAME*)play, keyframe, mtx, &aMHS_actor_draw_before, &aMHS_actor_draw_after, my_house); + shadow_data_pp = shadow_data[my_house->arg0]; + Matrix_translate(my_house->actor_class.world.position.x, my_house->actor_class.world.position.y, + my_house->actor_class.world.position.z, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + (*Common_Get(clip).bg_item_clip->draw_shadow_proc)((GAME*)play, shadow_data_pp[my_house->action & 1], 0); + aMHS_actor_draw_ta_clr(my_house, (GAME*)play); + } +} diff --git a/src/ac_my_house_move.c_inc b/src/ac_my_house_move.c_inc new file mode 100644 index 00000000..c5e42c11 --- /dev/null +++ b/src/ac_my_house_move.c_inc @@ -0,0 +1,483 @@ +static void aMHS_set_door_SE_sub(STRUCTURE_ACTOR* my_house, u16 se_idx) { + sAdo_OngenTrgStart(se_idx, &my_house->actor_class.world.position); +} + +static void aMHS_set_door_SE(STRUCTURE_ACTOR* my_house) { + static f32 chk_pat_in[4] = { 10.0f, 14.0f, 35.0f, 50.0f }; + static f32 chk_pat_out[4] = { 2.0f, 8.0f, 33.0f, 40.0f }; + static u16 se_no[4] = { 6, 7, 8, 9 }; + + f32* chk_pat_p; + int i; + + switch ((int)my_house->arg2_f) { + case 0: + case 3: + chk_pat_p = chk_pat_in; + break; + default: + chk_pat_p = chk_pat_out; + break; + } + + for (i = 0; i < 4; i++, chk_pat_p++) { + if (cKF_FrameControl_passCheck_now(&my_house->keyframe.frame_control, *chk_pat_p)) { + aMHS_set_door_SE_sub(my_house, se_no[i]); + break; + } + } +} + +static void aMHS_goto_next_pl_scene(GAME_PLAY* play, STRUCTURE_ACTOR* my_house) { + static int next_scene_no[mHm_HOMESIZE_NUM - 1] = { + SCENE_MY_ROOM_S, + SCENE_MY_ROOM_M, + SCENE_MY_ROOM_L, + SCENE_MY_ROOM_LL1, + }; + + static s16 startX[mHm_HOMESIZE_NUM - 1] = { + 120, + 160, + 200, + 200, + }; + + static s16 startZ[mHm_HOMESIZE_NUM - 1] = { + 220, + 300, + 380, + 380, + }; + + Door_data_c door_data; + + door_data.next_scene_id = next_scene_no[my_house->arg0]; + door_data.exit_orientation = mSc_DIRECT_NORTH; + door_data.exit_type = 0; + door_data.extra_data = 0; + door_data.exit_position.x = startX[my_house->arg0]; + door_data.exit_position.y = 0; + door_data.exit_position.z = startZ[my_house->arg0]; + door_data.door_actor_name = EMPTY_NO; + door_data.wipe_type = 1; + + goto_other_scene(play, &door_data, 0); + play->fb_fade_type = 9; +} + +// In +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome1; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome1; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome2; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome2; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome3; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome3; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome4; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome4; + +// Out +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome1_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome1_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome2_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome2_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome3_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome3_out; + +extern cKF_Animation_R_c cKF_ba_r_obj_s_myhome4_out; +extern cKF_Animation_R_c cKF_ba_r_obj_w_myhome4_out; + +static void aMHS_setup_animation(STRUCTURE_ACTOR* my_house, f32 speed) { + static cKF_Animation_R_c* ani[2][mHm_HOMESIZE_NUM - 1][2] = { + { + { &cKF_ba_r_obj_s_myhome1, &cKF_ba_r_obj_w_myhome1 }, + { &cKF_ba_r_obj_s_myhome2, &cKF_ba_r_obj_w_myhome2 }, + { &cKF_ba_r_obj_s_myhome3, &cKF_ba_r_obj_w_myhome3 }, + { &cKF_ba_r_obj_s_myhome4, &cKF_ba_r_obj_w_myhome4 }, + }, + { + { &cKF_ba_r_obj_s_myhome1_out, &cKF_ba_r_obj_w_myhome1_out }, + { &cKF_ba_r_obj_s_myhome2_out, &cKF_ba_r_obj_w_myhome2_out }, + { &cKF_ba_r_obj_s_myhome3_out, &cKF_ba_r_obj_w_myhome3_out }, + { &cKF_ba_r_obj_s_myhome4_out, &cKF_ba_r_obj_w_myhome4_out }, + } + }; + + static f32 start_idx[mHm_HOMESIZE_NUM - 1] = { 1.0f, 25.0f, 1.0f, 1.0f }; + static f32 end_idx[mHm_HOMESIZE_NUM - 1] = { 51.0f, 51.0f, 51.0f, 51.0f }; + + int type = (int)my_house->arg2_f; + int size = my_house->arg0; + int season = my_house->season == mTM_SEASON_WINTER; + int dir = 0; + + if (type != 0 && type != 3) { + dir = 1; + } + + cKF_SkeletonInfo_R_init(&my_house->keyframe, my_house->keyframe.skeleton, ani[dir][size][season], start_idx[type], + end_idx[type], start_idx[type], speed, 0.0f, cKF_FRAMECONTROL_STOP, NULL); +} + +static void aMHS_rewrite_pl_out_data(GAME_PLAY* play, STRUCTURE_ACTOR* my_house) { + static u8 out_drt[2] = { mSc_DIRECT_SOUTH_EAST, mSc_DIRECT_SOUTH_WEST }; + static f32 restartX[2] = { 48.29f, -48.29f }; + + Door_data_c* exit_data = Common_GetPointer(structure_exit_door_data); + int direct = my_house->action & 1; + + if (play->fb_wipe_mode == 0) { + xyz_t exit_pos; + s_xyz* exit_pos_p = &exit_data->exit_position; + + exit_data->next_scene_id = Save_Get(scene_no); + exit_data->exit_orientation = out_drt[direct]; + exit_data->exit_type = 0; + exit_data->extra_data = 2; + + exit_pos.x = my_house->actor_class.world.position.x + restartX[direct]; + exit_pos.z = my_house->actor_class.world.position.z + 48.29f; + exit_pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(exit_pos, 0.0f); + + exit_pos_p->x = exit_pos.x; + exit_pos_p->y = exit_pos.y; + exit_pos_p->z = exit_pos.z; + exit_data->door_actor_name = my_house->actor_class.npc_id; + exit_data->wipe_type = 1; + + Common_Set(house_owner_name, my_house->action); + } +} + +static f32 aMHS_player_chk_f[2] = { 1.0f, -1.0f }; +static u16 aMHS_player_chk_angl0[2] = { DEG2SHORT_ANGLE(-180.0f), DEG2SHORT_ANGLE(90.0f) }; +static u16 aMHS_player_chk_angl1[2] = { DEG2SHORT_ANGLE(-90.0f), DEG2SHORT_ANGLE(-180.0f) }; + +static int aMHS_check_player_sub(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) { + PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play); + int direct = my_house->action & 1; + f32 dist_x; + f32 dist_z; + int res = FALSE; + + if (player == NULL) { + return FALSE; + } + + dist_x = player->actor_class.world.position.x - my_house->arg0_f; + dist_z = player->actor_class.world.position.z - my_house->arg1_f; + + if ((dist_x * dist_x) + (dist_z * dist_z) < (40.0f * 40.0f) && + dist_z + dist_x * aMHS_player_chk_f[direct] < 40.0f) { + u16 angle_y = player->actor_class.shape_info.rotation.y; + + if (angle_y > aMHS_player_chk_angl0[direct] && angle_y < aMHS_player_chk_angl1[direct]) { + if (chkTrigger(BUTTON_A) == FALSE) { + return FALSE; + } + + if (Common_Get(reset_flag)) { + Common_Set(reset_type, 1); + } else { + res = TRUE; + } + } + } + + return res; +} + +static int aMHS_check_player_in_intro_demo(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) { + mDemo_Clip_c* clip = Common_Get(clip).demo_clip; + INTRO_DEMO_ACTOR* intro_demo; + + if (clip == NULL) { + return 0; + } + + intro_demo = (INTRO_DEMO_ACTOR*)clip->class; + if (intro_demo == NULL || clip->type != mDemo_CLIP_TYPE_INTRO_DEMO || mEv_CheckFirstIntro() == FALSE) { + return 0; + } + + if (my_house->arg3_f == TRUE && intro_demo->player_in_intro_demo == TRUE) { + return 1; + } + + if (mPlib_check_label_player_demo_wait((GAME*)play, my_house)) { + int action; + + my_house->arg3_f = TRUE; + action = my_house->action; + intro_demo->selected_house = action; + intro_demo->player_intro_demo_state = + mPr_NullCheckPersonalID(&Save_Get(homes[action]).ownerID) ? aID_STATE_TAKEN_HOUSE : aID_STATE_FREE_HOUSE; + return 2; + } else { + if (aMHS_check_player_sub(my_house, play) == TRUE) { + mPlib_request_main_demo_wait_type1((GAME*)play, 0, my_house); + } + + return 0; + } +} + +static void aMHS_set_demo_info(ACTOR* actorx) { + static int direct[2] = { mSc_DIRECT_NORTH_EAST, mSc_DIRECT_NORTH_WEST }; + + mDemo_Set_house_info(0.0f, direct[((STRUCTURE_ACTOR*)actorx)->action & 1]); + mDemo_Set_camera(CAMERA2_PROCESS_DOOR); +} + +static void aMHS_set_demo_info_save(ACTOR* actorx) { + aMHS_set_demo_info(actorx); + mBGMPsComp_make_ps_wipe(0x249); +} + +static int aMHS_check_player(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) { + int intro_demo_state; + + if (my_house->arg2_f != 0) { + if (my_house->arg2_f == 3) { + if (mDemo_Check(mDemo_TYPE_DOOR2, (ACTOR*)my_house)) { + return 1; + } + + mDemo_Request(mDemo_TYPE_DOOR2, (ACTOR*)my_house, &aMHS_set_demo_info_save); + return 0; + } else { + return 4; + } + } + + intro_demo_state = aMHS_check_player_in_intro_demo(my_house, play); + if (intro_demo_state != 2) { + if (intro_demo_state == 1) { + if (mDemo_Check(mDemo_TYPE_DOOR2, (ACTOR*)my_house)) { + return 1; + } else { + mDemo_Request(mDemo_TYPE_DOOR2, (ACTOR*)my_house, &aMHS_set_demo_info); + return 0; + } + } else { + if (mDemo_Check(mDemo_TYPE_DOOR, (ACTOR*)my_house)) { + return 1; + } else if (aMHS_check_player_sub(my_house, play)) { + mDemo_Request(mDemo_TYPE_DOOR, (ACTOR*)my_house, &aMHS_set_demo_info); + } + } + } + + return 0; +} + +typedef struct { + u8 centerRight_offset; + u8 leftUp_offset; + u8 leftDown_offset; + u8 rightDown_offset; + u8 rightUp_offset; + u8 shape; +} aMHS_ofs_c; + +static void aMHS_make_bgOffset(mCoBG_OffsetTable_c* ofs_tbl, s8 def_val, int side_idx) { + static s8 height_tbl[32 * 6] = { + // East + 4, 4, 4, 4, 4, 0, 4, 4, 4, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 4, 11, 11, 1, 11, 11, 11, 11, + 11, 0, 11, 11, 11, 0, 11, 1, 0, 0, 0, 0, 0, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, + 0, 4, 4, 4, 0, 4, 1, 4, 4, 4, 4, 4, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0, + // West + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 1, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 11, 11, 0, 11, 11, 1, + 11, 11, 11, 11, 11, 0, 11, 11, 11, 4, 11, 1, 4, 4, 0, 4, 4, 1, 11, 11, 11, 11, 11, 0, 11, 11, 11, 11, 11, 0, 11, + 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0, 11, 4, 11, 11, 11, 1, 11, 11, 11, 11, 4, 1, 4, 4, 4, 4, 4, 0 + }; + + int ofs; + int i; + + if (side_idx == 0) { + ofs = 0; + } else { + ofs = 6 * 16; + } + + for (i = 0; i != 16; i++, ofs_tbl++) { + ofs_tbl->unit_attribute = mCoBG_ATTRIBUTE_NONE; + ofs_tbl->centerRight_offset = (height_tbl[ofs + i * 6 + 0] != 11) ? height_tbl[ofs + i * 6 + 0] : def_val; + ofs_tbl->leftUp_offset = (height_tbl[ofs + i * 6 + 1] != 11) ? height_tbl[ofs + i * 6 + 1] : def_val; + ofs_tbl->leftDown_offset = (height_tbl[ofs + i * 6 + 2] != 11) ? height_tbl[ofs + i * 6 + 2] : def_val; + ofs_tbl->rightDown_offset = (height_tbl[ofs + i * 6 + 3] != 11) ? height_tbl[ofs + i * 6 + 3] : def_val; + ofs_tbl->rightUp_offset = (height_tbl[ofs + i * 6 + 4] != 11) ? height_tbl[ofs + i * 6 + 4] : def_val; + ofs_tbl->shape = height_tbl[ofs + i * 6 + 5]; + } +} + +static void aMHS_set_bgOffset(ACTOR* actorx, int flag) { + static s8 height_dt[mHm_HOMESIZE_NUM - 1] = { 11, 14, 15, 14 }; + static s8 addX[8] = { + 216, 0, 40, 80, 176, 216, 0, 40, + }; + static s8 addZ[4] = { 90, 40, 0, 216 }; + + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx; + int side_idx = my_house->action & 1; + int addX_ofs = side_idx == 0 ? 0 : 4; + mCoBG_OffsetTable_c offset_tbl[4 * 4]; + mCoBG_OffsetTable_c* ofs_p; + mCoBG_OffsetTable_c tmp_ofs; + xyz_t pos; + int z; + int x; + +// @BUG - they use the side of the house to get the size default rather than the index itself +#ifndef BUGFIXES + aMHS_make_bgOffset(offset_tbl, height_dt[Save_Get(homes[side_idx]).size_info.size], side_idx); +#else + aMHS_make_bgOffset(offset_tbl, height_dt[Save_Get(homes[my_house->action & 3]).size_info.size], side_idx); +#endif + + ofs_p = offset_tbl; + for (z = 0; z < 4; z++) { + pos.z = actorx->home.position.z + addZ[z]; + + for (x = 0; x < 4; x++) { + pos.x = actorx->home.position.x + addX[addX_ofs + x]; + + mCoBG_SetPluss5PointOffset_file(pos, *ofs_p, __FILE__, 651); + ofs_p++; + } + } +} + +static int aMHS_light_ctrl(STRUCTURE_ACTOR* my_house) { + return mRmTp_Index2LightSwitchStatus((my_house->action & 3) * 2) != FALSE; +} + +static void aMHS_wait(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) { + switch (aMHS_check_player(my_house, play)) { + case 1: + aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR_WAIT); + break; + case 4: + if (mPlib_check_player_outdoor_start((GAME*)play)) { + aMHS_setup_animation(my_house, 0.5f); + aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR); + } + } +} + +static void aMHS_open_door_wait(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) { + ACTOR* actorx = (ACTOR*)my_house; + + if (actorx == (*GET_PLAYER_ACTOR_NOW()->get_door_label_proc)(gamePT)) { + mBGMPsComp_make_ps_wipe(0x249); + aMHS_setup_animation(my_house, 0.5f); + aMHS_setup_action(my_house, aMHS_ACTION_OPEN_DOOR); + } +} + +static void aMHS_open_door(STRUCTURE_ACTOR* my_house, GAME_PLAY* play) { + if (cKF_SkeletonInfo_R_play(&my_house->keyframe) != cKF_STATE_STOPPED) { + aMHS_door_closed_flag[my_house->arg0] = FALSE; + } else { + void* demo_class; + INTRO_DEMO_ACTOR* intro_demo; + int next_act; + + if (my_house->arg2_f == 3) { + if (my_house->actor_class.world.angle.z == 0) { + my_house->actor_class.world.angle.z = 1; + } + + next_act = aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT; + } else if (my_house->arg2_f == 0) { + aMHS_rewrite_pl_out_data(play, my_house); + aMHS_goto_next_pl_scene(play, my_house); + + if (Common_Get(clip).demo_clip != NULL && Common_Get(clip).demo_clip->type == mDemo_CLIP_TYPE_INTRO_DEMO) { + demo_class = Common_Get(clip).demo_clip->class; + + if (demo_class != NULL) { + intro_demo = (INTRO_DEMO_ACTOR*)demo_class; + + intro_demo->player_in_intro_demo = FALSE; + } + } + + mDemo_End((ACTOR*)my_house); + next_act = aMHS_ACTION_GOTO_NEXT_SCEEN_WAIT; + } else { + next_act = aMHS_ACTION_WAIT; + } + + aMHS_setup_action(my_house, next_act); + my_house->arg2_f = 0; + my_house->request_type = 0; + } +} + +static void aMHS_setup_action(STRUCTURE_ACTOR* my_house, int action) { + static aSTR_MOVE_PROC process[aMHS_ACTION_NUM] = { + &aMHS_wait, + &aMHS_open_door_wait, + &aMHS_open_door, + (aSTR_MOVE_PROC)&none_proc1, + }; + + aMHS_door_closed_flag[my_house->arg0] = TRUE; + my_house->action_proc = process[action]; +} + +static void aMHS_actor_move(ACTOR* actorx, GAME* game) { + // clang-format off + static Door_data_c door_data = { + SCENE_PLAYERSELECT_SAVE, + mSc_DIRECT_NORTH, + 0, + 0, + 100, 0, 120, + EMPTY_NO, + 1, + 0, 0, 0 + }; + // clang-format on + + static u8 drtbl[] = { + mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, mSc_DIRECT_SOUTH, + mSc_DIRECT_SOUTH_EAST, mSc_DIRECT_EAST, mSc_DIRECT_NORTH_EAST, + }; + + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + + my_house->arg2_f = drtbl[my_house->request_type]; + aMHS_set_door_SE(my_house); + actorx->actor_specific -= (s16)(mEnv_GetWindPowerF() * 1000.0f); + (*my_house->action_proc)(my_house, play); + + if (aMHS_light_ctrl(my_house)) { + chase_s(&my_house->actor_class.world.angle.x, DEG2SHORT_ANGLE(90.0f) - 1, 320); + } else { + chase_s(&my_house->actor_class.world.angle.x, DEG2SHORT_ANGLE(0.0f), 320); + } + + if (my_house->actor_class.world.angle.z > 0) { + goto_other_scene(play, &door_data, 1); + Common_Get(transition).wipe_type = 3; + play->fb_fade_type = 9; + my_house->actor_class.world.angle.z = -1; + } +} + +static void aMHS_actor_init(ACTOR* actorx, GAME* game) { + STRUCTURE_ACTOR* my_house = (STRUCTURE_ACTOR*)actorx; + + mFI_SetFG_common(DUMMY_HOUSE0 + my_house->action, actorx->home.position, FALSE); + aMHS_actor_move(actorx, game); + actorx->mv_proc = &aMHS_actor_move; +} diff --git a/src/ac_npc_rtc.c b/src/ac_npc_rtc.c index 57037cfe..5d01b8bf 100644 --- a/src/ac_npc_rtc.c +++ b/src/ac_npc_rtc.c @@ -14,57 +14,41 @@ extern void aNRTC_actor_init(ACTOR*, GAME*); extern void aNRTC_actor_save(ACTOR*, GAME*); ACTOR_PROFILE Npc_Rtc_Profile = { - mAc_PROFILE_NPC_RTC, - ACTOR_PART_NPC, - ACTOR_STATE_NONE, - SP_NPC_RTC, - ACTOR_OBJ_BANK_KEEP, - sizeof(NPCRTC_ACTOR), - aNRTC_actor_ct, - aNRTC_actor_dt, - aNRTC_actor_init, - mActor_NONE_PROC1, - aNRTC_actor_save, + mAc_PROFILE_NPC_RTC, ACTOR_PART_NPC, ACTOR_STATE_NONE, SP_NPC_RTC, ACTOR_OBJ_BANK_KEEP, sizeof(NPCRTC_ACTOR), + aNRTC_actor_ct, aNRTC_actor_dt, aNRTC_actor_init, mActor_NONE_PROC1, aNRTC_actor_save, }; extern void aNRTC_actor_move(ACTOR*, GAME*); extern void aNRTC_actor_draw(ACTOR*, GAME*); -extern int aNRTC_talk_init(ACTOR*, GAME*); +extern int aNRTC_talk_init(ACTOR*, GAME*); extern int aNRTC_talk_end_chk(ACTOR*, GAME*); extern void aNRTC_schedule_proc(NPC_ACTOR*, GAME_PLAY*, int); -extern void aNRTC_talk_request(ACTOR* actor,GAME*); +extern void aNRTC_talk_request(ACTOR* actor, GAME*); extern void aNRTC_change_talk_proc(NPCRTC_ACTOR* rtc, int idx); -u8 aNRTC_sound_mode[] = {0x00,0x01,0x02,0x00}; -u8 aNRTC_voice_mode[] = {0x00,0x01,0x02,0x00}; +u8 aNRTC_sound_mode[] = { 0x00, 0x01, 0x02, 0x00 }; +u8 aNRTC_voice_mode[] = { 0x00, 0x01, 0x02, 0x00 }; -void aNRTC_actor_ct(ACTOR* actor, GAME* game){ - static aNPC_ct_data_c ct_data = { - &aNRTC_actor_move, - &aNRTC_actor_draw, - 5, - mActor_NONE_PROC1, - &aNRTC_talk_init, - &aNRTC_talk_end_chk, - 0 - }; +void aNRTC_actor_ct(ACTOR* actor, GAME* game) { + static aNPC_ct_data_c ct_data = { &aNRTC_actor_move, &aNRTC_actor_draw, 5, mActor_NONE_PROC1, + &aNRTC_talk_init, &aNRTC_talk_end_chk, 0 }; NPCRTC_ACTOR* rtc = (NPCRTC_ACTOR*)actor; GAME_PLAY* play = (GAME_PLAY*)game; PLAYER_ACTOR* player; xyz_t center; xyz_t eye; - if(Common_Get(clip.npc_clip)->birth_check_proc(actor,game) == TRUE){ + if (Common_Get(clip.npc_clip)->birth_check_proc(actor, game) == TRUE) { rtc->npc_class.schedule.schedule_proc = aNRTC_schedule_proc; - Common_Get(clip.npc_clip)->ct_proc(actor,game,&ct_data); + Common_Get(clip.npc_clip)->ct_proc(actor, game, &ct_data); actor->status_data.weight = MASSTYPE_IMMOVABLE; - mPlib_request_main_demo_wait_type1(play,0,NULL); - player = GET_PLAYER_ACTOR(play); - if(player != NULL){ + mPlib_request_main_demo_wait_type1(game, 0, NULL); + player = GET_PLAYER_ACTOR(play); + if (player != NULL) { player->actor_class.state_bitfield |= 0x80; } @@ -75,8 +59,8 @@ void aNRTC_actor_ct(ACTOR* actor, GAME* game){ eye.x = 100.0f; eye.y = 130.0f; eye.z = 210.0f; - - Camera2_change_priority(play,0); + + Camera2_change_priority(play, 0); Camera2_request_main_lock(play, ¢er, &eye, 40.0f, 0, 100.0f, 400.0f, 5); sAdo_SetOutMode(aNRTC_sound_mode[Save_Get(config.sound_mode)]); sAdo_SetVoiceMode(aNRTC_voice_mode[Save_Get(config.voice_mode)]); @@ -84,48 +68,45 @@ void aNRTC_actor_ct(ACTOR* actor, GAME* game){ rtc->npc_class.talk_info.default_act = 9; rtc->npc_class.talk_info.melody_inst = 0; rtc->unk9A0 = 0; - } + } } - void aNRTC_actor_save(ACTOR* actor, GAME* game) { - Common_Get(clip.npc_clip)->save_proc(actor,game); + Common_Get(clip.npc_clip)->save_proc(actor, game); } void aNRTC_actor_dt(ACTOR* actor, GAME* game) { - Common_Get(clip.npc_clip)->dt_proc(actor,game); + Common_Get(clip.npc_clip)->dt_proc(actor, game); } void aNRTC_actor_init(ACTOR* actor, GAME* game) { - Common_Get(clip.npc_clip)->init_proc(actor,game); + Common_Get(clip.npc_clip)->init_proc(actor, game); } -void aNRTC_actor_move(ACTOR* actor, GAME* game){ +void aNRTC_actor_move(ACTOR* actor, GAME* game) { StaffRoll info; f32 val = 0.5f; u8 arm_flag = TRUE; NPCRTC_ACTOR* rtc = (NPCRTC_ACTOR*)actor; GAME_PLAY* play = (GAME_PLAY*)game; - - if(rtc->npc_class.draw.animation_id == 0x76){ + if (rtc->npc_class.draw.animation_id == 0x76) { sAdos_GetStaffRollInfo(&info); - if(info.unk0 != 4){ + if (info.unk0 != 4) { val = 0.0f; arm_flag = FALSE; - rtc->npc_class.draw.main_animation.keyframe.frame_control.current_frame = 1.0f + (64.0f * (f32)info.unk8); + rtc->npc_class.draw.main_animation.keyframe.frame_control.current_frame = 1.0f + (64.0f * (f32)info.unk8); } - } + } rtc->npc_class.draw.main_animation.keyframe.frame_control.speed = val; sAdos_TTKK_ARM(arm_flag); - Common_Get(clip.npc_clip)->move_proc(actor,game); + Common_Get(clip.npc_clip)->move_proc(actor, game); mSC_change_player_freeze(play); } - void aNRTC_actor_draw(ACTOR* actor, GAME* game) { - Common_Get(clip.npc_clip)->draw_proc(actor,game); + Common_Get(clip.npc_clip)->draw_proc(actor, game); } #include "../src/ac_npc_rtc_think.c.inc" diff --git a/src/m_scene.c b/src/m_scene.c index 43b256c0..d4e72a15 100644 --- a/src/m_scene.c +++ b/src/m_scene.c @@ -12,308 +12,298 @@ #include "m_scene_ftr.h" static void mSc_set_bank_status_after(Object_Bank_c* bank) { - bank->bank_id = ABS(bank->bank_id); - bank->ram_start = bank->dma_start; - bank->state = 0; + bank->bank_id = ABS(bank->bank_id); + bank->ram_start = bank->dma_start; + bank->state = 0; } static void mSc_clear_bank_status(Object_Bank_c* bank) { - bank->bank_id = 0; - bank->size = 0; - bank->dma_start = NULL; - bank->ram_start = NULL; + bank->bank_id = 0; + bank->size = 0; + bank->dma_start = NULL; + bank->ram_start = NULL; } static void Object_Exchange_keep_new_Player(GAME_PLAY* play) { - mPlib_Object_Exchange_keep_new_PlayerMdl(play); - mPlib_Object_Exchange_keep_new_PlayerTex(play, 0, 0); - mPlib_Object_Exchange_keep_new_PlayerPallet(play, 0, 0); - mPlib_Object_Exchange_keep_new_PlayerTex(play, 1, 2); - mPlib_Object_Exchange_keep_new_PlayerPallet(play, 1, 2); - mPlib_Object_Exchange_keep_new_PlayerFaceTex(play); - mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 1, 0); - mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 2, 1); + mPlib_Object_Exchange_keep_new_PlayerMdl(play); + mPlib_Object_Exchange_keep_new_PlayerTex(play, 0, 0); + mPlib_Object_Exchange_keep_new_PlayerPallet(play, 0, 0); + mPlib_Object_Exchange_keep_new_PlayerTex(play, 1, 2); + mPlib_Object_Exchange_keep_new_PlayerPallet(play, 1, 2); + mPlib_Object_Exchange_keep_new_PlayerFaceTex(play); + mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 1, 0); + mPlib_Object_Exchange_keep_new_PlayerFacePallet(play, 2, 1); } extern char* mSc_secure_exchange_keep_bank(Object_Exchange_c* exchange, s16 bank_id, size_t size) { - char* area = NULL; - Object_Bank_c* bank = exchange->banks + exchange->bank_idx; + char* area = NULL; + Object_Bank_c* bank = exchange->banks + exchange->bank_idx; - if (exchange->bank_idx < mSc_OBJECT_BANK_NUM) { - area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + size, 32); + if (exchange->bank_idx < mSc_OBJECT_BANK_NUM) { + area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + size, 32); - if (area >= exchange->max_ram_address) { - area = NULL; + if (area >= exchange->max_ram_address) { + area = NULL; + } else { + bank->bank_id = bank_id; + bank->ram_start = exchange->next_bank_ram_address; + bank->dma_start = exchange->next_bank_ram_address; + bank->rom_addr = 0; + bank->size = size; + bank->num_exist = 0; + bank->state = 3; + + exchange->next_bank_ram_address = area; + exchange->bank_idx++; + } } - else { - bank->bank_id = bank_id; - bank->ram_start = exchange->next_bank_ram_address; - bank->dma_start = exchange->next_bank_ram_address; - bank->rom_addr = 0; - bank->size = size; - bank->num_exist = 0; - bank->state = 3; - exchange->next_bank_ram_address = area; - exchange->bank_idx++; - } - } - - return area; + return area; } extern void mSc_background_dmacopy_controller(Object_Bank_c* bank) { - switch (bank->state) { - case 1: - { - if (bank->_14 == 0) { - osCreateMesgQueue(&bank->dma_controller_msg_queue, &bank->dma_controller_msg, 1); - _JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size); - DCStoreRangeNoSync(bank->dma_start, bank->size); - bank->state = 0; - } + switch (bank->state) { + case 1: { + if (bank->_14 == 0) { + osCreateMesgQueue(&bank->dma_controller_msg_queue, &bank->dma_controller_msg, 1); + _JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size); + DCStoreRangeNoSync(bank->dma_start, bank->size); + bank->state = 0; + } - break; + break; + } + + case 2: { + if (osRecvMesg(&bank->dma_controller_msg_queue, NULL, OS_MESSAGE_NOBLOCK) == FALSE) { + mSc_set_bank_status_after(bank); + } + + break; + } } - - case 2: - { - if (osRecvMesg(&bank->dma_controller_msg_queue, NULL, OS_MESSAGE_NOBLOCK) == FALSE) { - mSc_set_bank_status_after(bank); - } - - break; - } - } } extern void mSc_dmacopy_data_bank(Object_Exchange_c* exchange) { - /* stubbed */ + /* stubbed */ } extern int mSc_bank_regist_check(Object_Exchange_c* exchange, s16 bank_id) { - int res = -1; - int i; + int res = -1; + int i; - for (i = 0; i < mSc_OBJECT_BANK_NUM; i++) { - if (ABS(exchange->banks[i].bank_id) == bank_id) { - res = i; + for (i = 0; i < mSc_OBJECT_BANK_NUM; i++) { + if (ABS(exchange->banks[i].bank_id) == bank_id) { + res = i; - break; + break; + } } - } - return res; + return res; } extern void mSc_regist_initial_exchange_bank(GAME_PLAY* play) { - play->object_exchange.selected_partition = 0; - play->object_exchange.exchange_id = play->object_exchange.bank_idx; + play->object_exchange.selected_partition = 0; + play->object_exchange.exchange_id = play->object_exchange.bank_idx; - if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) { - u32 size; - - /* Split the remaining object exchange space into two equal portions */ - size = (u32)(play->object_exchange.max_ram_address - play->object_exchange.next_bank_ram_address) / 2; - play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address; - play->object_exchange.end_address_save[0] = (char*)ALIGN_NEXT((u32)play->object_exchange.next_bank_ram_address + size, 32); - - play->object_exchange.start_address_save[1] = play->object_exchange.end_address_save[0]; - play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address; + if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) { + u32 size; - /* Temporarily limit the maximum address to half the remaining free space */ - play->object_exchange.max_ram_address = play->object_exchange.end_address_save[0]; - } - else { - play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address; - play->object_exchange.end_address_save[0] = play->object_exchange.max_ram_address; - - play->object_exchange.start_address_save[1] = play->object_exchange.next_bank_ram_address; - play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address; - } + /* Split the remaining object exchange space into two equal portions */ + size = (u32)(play->object_exchange.max_ram_address - play->object_exchange.next_bank_ram_address) / 2; + play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address; + play->object_exchange.end_address_save[0] = + (char*)ALIGN_NEXT((u32)play->object_exchange.next_bank_ram_address + size, 32); - play->object_exchange.exchange_id = play->object_exchange.bank_idx; /* leftover from DnM? */ + play->object_exchange.start_address_save[1] = play->object_exchange.end_address_save[0]; + play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address; + + /* Temporarily limit the maximum address to half the remaining free space */ + play->object_exchange.max_ram_address = play->object_exchange.end_address_save[0]; + } else { + play->object_exchange.start_address_save[0] = play->object_exchange.next_bank_ram_address; + play->object_exchange.end_address_save[0] = play->object_exchange.max_ram_address; + + play->object_exchange.start_address_save[1] = play->object_exchange.next_bank_ram_address; + play->object_exchange.end_address_save[1] = play->object_exchange.max_ram_address; + } + + play->object_exchange.exchange_id = play->object_exchange.bank_idx; /* leftover from DnM? */ } static void mSc_dmacopy_all_exchange_bank_sub(Object_Bank_c* bank, Object_Exchange_c* exchange, int idx) { - if (idx >= exchange->exchange_id) { - char* area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32); + if (idx >= exchange->exchange_id) { + char* area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32); - if (area >= exchange->max_ram_address) { - exchange->selected_partition = (exchange->selected_partition + 1) % 2; - exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition]; - exchange->max_ram_address = exchange->end_address_save[exchange->selected_partition]; + if (area >= exchange->max_ram_address) { + exchange->selected_partition = (exchange->selected_partition + 1) % 2; + exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition]; + exchange->max_ram_address = exchange->end_address_save[exchange->selected_partition]; - area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32); + area = (char*)ALIGN_NEXT((u32)exchange->next_bank_ram_address + bank->size, 32); + } + + bank->dma_start = exchange->next_bank_ram_address; + bank->part_id = exchange->selected_partition; + exchange->next_bank_ram_address = area; } - bank->dma_start = exchange->next_bank_ram_address; - bank->part_id = exchange->selected_partition; - exchange->next_bank_ram_address = area; - } - - _JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size); - DCStoreRangeNoSync(bank->dma_start, bank->size); - mSc_set_bank_status_after(bank); + _JW_GetResourceAram(bank->rom_addr, (u8*)bank->dma_start, bank->size); + DCStoreRangeNoSync(bank->dma_start, bank->size); + mSc_set_bank_status_after(bank); } extern void mSc_dmacopy_all_exchange_bank(Object_Exchange_c* exchange) { - Object_Bank_c* bank; - int i; + Object_Bank_c* bank; + int i; - bank = exchange->banks + exchange->keep_id; - exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition]; + bank = exchange->banks + exchange->keep_id; + exchange->next_bank_ram_address = exchange->start_address_save[exchange->selected_partition]; - for (i = exchange->keep_id; i < mSc_OBJECT_BANK_NUM; i++) { - if (bank->bank_id != 0 && bank->state != 3) { - if (bank->bank_id < 0) { - mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i); - } - else if (bank->num_exist != 0) { - mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i); - } - else if (i >= exchange->exchange_id) { - mSc_clear_bank_status(bank); - } - else { - bank->bank_id = 0; - } + for (i = exchange->keep_id; i < mSc_OBJECT_BANK_NUM; i++) { + if (bank->bank_id != 0 && bank->state != 3) { + if (bank->bank_id < 0) { + mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i); + } else if (bank->num_exist != 0) { + mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i); + } else if (i >= exchange->exchange_id) { + mSc_clear_bank_status(bank); + } else { + bank->bank_id = 0; + } + } + + bank++; } - bank++; - } + if (Common_Get(clip).npc_clip != NULL) { + Common_Get(clip).npc_clip->rebuild_dma_proc(); + } - if (Common_Get(clip).npc_clip != NULL) { - Common_Get(clip).npc_clip->rebuild_dma_proc(); - } + if (Common_Get(clip)._068 != NULL) { + (*Common_Get(clip)._068)(); + } - if (Common_Get(clip)._068 != NULL) { - (*Common_Get(clip)._068)(); - } + if (Common_Get(clip).shop_manekin_clip != NULL) { + Common_Get(clip).shop_manekin_clip->manekin_dma_again_proc(); + } - if (Common_Get(clip).shop_manekin_clip != NULL) { - Common_Get(clip).shop_manekin_clip->manekin_dma_again_proc(); - } + if (Common_Get(clip).shop_indoor_clip != NULL) { + Common_Get(clip).shop_indoor_clip->indoor_dma_again_proc(); + } - if (Common_Get(clip).shop_indoor_clip != NULL) { - Common_Get(clip).shop_indoor_clip->indoor_dma_again_proc(); - } + if (Common_Get(clip).my_room_clip != NULL) { + Common_Get(clip).my_room_clip->redma_ftr_bank_proc(); + } - if (Common_Get(clip).my_room_clip != NULL) { - Common_Get(clip).my_room_clip->redma_ftr_bank_proc(); - } + if (Common_Get(clip).my_indoor_clip != NULL) { + Common_Get(clip).my_indoor_clip->indoor_dma_again_proc(); + } - if (Common_Get(clip).my_indoor_clip != NULL) { - Common_Get(clip).my_indoor_clip->indoor_dma_again_proc(); - } + if (Common_Get(clip).arrange_room_clip != NULL) { + Common_Get(clip).arrange_room_clip->redma_proc(); + } - if (Common_Get(clip).arrange_room_clip != NULL) { - Common_Get(clip).arrange_room_clip->redma_proc(); - } + if (Common_Get(clip).shop_umbrella_clip != NULL) { + Common_Get(clip).shop_umbrella_clip->umbrella_dma_again_proc(); + } - if (Common_Get(clip).shop_umbrella_clip != NULL) { - Common_Get(clip).shop_umbrella_clip->umbrella_dma_again_proc(); - } - - if (Common_Get(clip).ball_redma_proc != NULL) { - (*Common_Get(clip).ball_redma_proc)(); - } + if (Common_Get(clip).ball_redma_proc != NULL) { + (*Common_Get(clip).ball_redma_proc)(); + } } extern void mSc_data_bank_ct(GAME_PLAY* play, Object_Exchange_c* exchange) { - char* exchange_arena; + char* exchange_arena; - bzero(exchange, sizeof(Object_Exchange_c)); + bzero(exchange, sizeof(Object_Exchange_c)); - exchange->keep_id = -1; - exchange->exchange_id = -1; + exchange->keep_id = -1; + exchange->exchange_id = -1; - exchange_arena = (char*)THA_allocAlign(&play->game.tha, mSc_ARENA_SIZE, ~0x1F); - exchange->next_bank_ram_address = exchange_arena; - exchange->start_address_save[0] = exchange_arena; - exchange->start_address_save[1] = exchange_arena; + exchange_arena = (char*)THA_allocAlign(&play->game.tha, mSc_ARENA_SIZE, ~0x1F); + exchange->next_bank_ram_address = exchange_arena; + exchange->start_address_save[0] = exchange_arena; + exchange->start_address_save[1] = exchange_arena; - exchange_arena += mSc_ARENA_SIZE; - exchange->max_ram_address = exchange_arena; - exchange->end_address_save[0] = exchange_arena; - exchange->end_address_save[1] = exchange_arena; + exchange_arena += mSc_ARENA_SIZE; + exchange->max_ram_address = exchange_arena; + exchange->end_address_save[0] = exchange_arena; + exchange->end_address_save[1] = exchange_arena; } extern void mSc_decide_exchange_bank(Object_Exchange_c* exchange) { - exchange->keep_id = exchange->bank_idx; - exchange->_194C = exchange->next_bank_ram_address; + exchange->keep_id = exchange->bank_idx; + exchange->_194C = exchange->next_bank_ram_address; } static void Scene_player_select(int scene_no, int npc_actor) { - if (Save_Get(scene_no) == scene_no) { - int met_villagers_bitfield = 0; - int met_villagers_num = 0; - mActor_name_t npc_id; - Animal_c* animal = Save_Get(animals); - Anmmem_c* memory; - int i; - int j; - int selected; + if (Save_Get(scene_no) == scene_no) { + int met_villagers_bitfield = 0; + int met_villagers_num = 0; + mActor_name_t npc_id; + Animal_c* animal = Save_Get(animals); + Anmmem_c* memory; + int i; + int j; + int selected; - /* Track all villagers who have met a player from town before */ - for (i = 0; i < ANIMAL_NUM_MAX; i++) { - if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) { - memory = animal->memories; + /* Track all villagers who have met a player from town before */ + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) { + memory = animal->memories; - for (j = 0; j < ANIMAL_MEMORY_NUM; j++) { - if ( - memory->memory_player_id.land_id == Save_Get(land_info).id && - mLd_CheckCmpLandName(memory->memory_player_id.land_name, Save_Get(land_info).name) == TRUE - ) { - met_villagers_bitfield |= (1 << i); - met_villagers_num++; + for (j = 0; j < ANIMAL_MEMORY_NUM; j++) { + if (memory->memory_player_id.land_id == Save_Get(land_info).id && + mLd_CheckCmpLandName(memory->memory_player_id.land_name, Save_Get(land_info).name) == TRUE) { + met_villagers_bitfield |= (1 << i); + met_villagers_num++; - break; - } + break; + } - memory++; - } - } + memory++; + } + } - animal++; - } - - /* Roll a random villager if none have met a player in town before */ - if (met_villagers_num == 0) { - do { - selected = RANDOM(ANIMAL_NUM_MAX); - } while (mNpc_CheckFreeAnimalPersonalID(&Save_Get(animals[selected]).id)); - - npc_id = Save_Get(animals[selected]).id.npc_id; - i = mNpc_SearchAnimalinfo(Save_Get(animals), npc_id, ANIMAL_NUM_MAX); - } - else { - /* Pick a random villager which has met a player in town */ - - selected = RANDOM(met_villagers_num); - - for (i = 0; i < ANIMAL_NUM_MAX; i++) { - if ((met_villagers_bitfield & 1) != 0) { - if (selected == 0) { - break; - } - else { - selected--; - } + animal++; } - met_villagers_bitfield >>= 1; - } + /* Roll a random villager if none have met a player in town before */ + if (met_villagers_num == 0) { + do { + selected = RANDOM(ANIMAL_NUM_MAX); + } while (mNpc_CheckFreeAnimalPersonalID(&Save_Get(animals[selected]).id)); - npc_id = Save_Get(animals[i]).id.npc_id; + npc_id = Save_Get(animals[selected]).id.npc_id; + i = mNpc_SearchAnimalinfo(Save_Get(animals), npc_id, ANIMAL_NUM_MAX); + } else { + /* Pick a random villager which has met a player in town */ + + selected = RANDOM(met_villagers_num); + + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + if ((met_villagers_bitfield & 1) != 0) { + if (selected == 0) { + break; + } else { + selected--; + } + } + + met_villagers_bitfield >>= 1; + } + + npc_id = Save_Get(animals[i]).id.npc_id; + } + + if (scene_no == SCENE_PLAYERSELECT_2) { + Common_Set(player_select_animal_no, i); + } + + mNpc_RegistEventNpc(npc_actor, npc_id, npc_id, Save_Get(animals[i]).cloth); } - - if (scene_no == SCENE_PLAYERSELECT_2) { - Common_Set(player_select_animal_no, i); - } - - mNpc_RegistEventNpc(npc_actor, npc_id, npc_id, Save_Get(animals[i]).cloth); - } } static void Scene_Proc_Player_Ptr(GAME_PLAY* play, Scene_Word_u* data); @@ -330,259 +320,246 @@ static void Scene_Proc_Sound(GAME_PLAY* play, Scene_Word_u* data); typedef void (*mSc_SCENE_WORD_PROC)(GAME_PLAY*, Scene_Word_u*); extern void Scene_ct(GAME_PLAY* play, Scene_Word_u* scene_data) { - static mSc_SCENE_WORD_PROC Scene_Proc[mSc_SCENE_DATA_TYPE_NUM] = { - &Scene_Proc_Player_Ptr, - &Scene_Proc_Ctrl_Actor_Ptr, - &Scene_Proc_Actor_Ptr, - &Scene_Proc_Object_Exchange_Bank_Ptr, - &Scene_Proc_Door_Data_Ptr, - &Scene_Proc_Field_ct, - &Scene_Proc_MyRoom_ct, - &Scene_Proc_ArrangeRoom_ct, - &Scene_Proc_ArrangeFurniture_ct, - &Scene_Proc_Sound, - NULL - }; + static mSc_SCENE_WORD_PROC Scene_Proc[mSc_SCENE_DATA_TYPE_NUM] = { &Scene_Proc_Player_Ptr, + &Scene_Proc_Ctrl_Actor_Ptr, + &Scene_Proc_Actor_Ptr, + &Scene_Proc_Object_Exchange_Bank_Ptr, + &Scene_Proc_Door_Data_Ptr, + &Scene_Proc_Field_ct, + &Scene_Proc_MyRoom_ct, + &Scene_Proc_ArrangeRoom_ct, + &Scene_Proc_ArrangeFurniture_ct, + &Scene_Proc_Sound, + NULL }; - /* Initialize all scene data */ - while (TRUE) { - u32 type = scene_data->misc.type; - - if (type == mSc_SCENE_DATA_TYPE_END) { - break; - } - - if (type < mSc_SCENE_DATA_TYPE_NUM) { - (*Scene_Proc[type])(play, scene_data); + /* Initialize all scene data */ + while (TRUE) { + u32 type = scene_data->misc.type; + + if (type == mSc_SCENE_DATA_TYPE_END) { + break; + } + + if (type < mSc_SCENE_DATA_TYPE_NUM) { + (*Scene_Proc[type])(play, scene_data); + } + + scene_data++; } - scene_data++; - } + /* Setup player select actors */ + Scene_player_select(SCENE_PLAYERSELECT_2, SP_NPC_P_SEL2); // load + Scene_player_select(SCENE_PLAYERSELECT_SAVE, SP_NPC_RESTART); // save - /* Setup player select actors */ - Scene_player_select(SCENE_PLAYERSELECT_2, SP_NPC_P_SEL2); // load - Scene_player_select(SCENE_PLAYERSELECT_SAVE, SP_NPC_RESTART); // save + /* Select Rover or Blanca for visiting town scene */ + if (Save_Get(scene_no) == SCENE_START_DEMO3) { + int rover_shown = FALSE; - /* Select Rover or Blanca for visiting town scene */ - if (Save_Get(scene_no) == SCENE_START_DEMO3) { - int rover_shown = FALSE; + if (mLd_CheckCmpLand(Common_Get(now_private)->player_ID.land_name, Common_Get(now_private)->player_ID.land_id, + Common_Get(travel_persistent_data).land.name, + Common_Get(travel_persistent_data).land.id) == TRUE) { + if (Common_Get(now_private)->state_flags & mPr_FLAG_MASK_CAT_SCHEDULED) { + Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED; + rover_shown = TRUE; + } else if (fqrand() < 0.5f) { + Common_Get(now_private)->state_flags |= mPr_FLAG_MASK_CAT_SCHEDULED; // Blanca is scheduled + } else { + Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED; + rover_shown = TRUE; + } + } else { + rover_shown = TRUE; + } - if ( - mLd_CheckCmpLand( - Common_Get(now_private)->player_ID.land_name, Common_Get(now_private)->player_ID.land_id, - Common_Get(travel_persistent_data).land.name, Common_Get(travel_persistent_data).land.id - ) == TRUE - ) { - if (Common_Get(now_private)->state_flags & mPr_FLAG_MASK_CAT_SCHEDULED) { - Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED; - rover_shown = TRUE; - } - else if (fqrand() < 0.5f) { - Common_Get(now_private)->state_flags |= mPr_FLAG_MASK_CAT_SCHEDULED; // Blanca is scheduled - } - else { - Common_Get(now_private)->state_flags &= ~mPr_FLAG_MASK_CAT_SCHEDULED; - rover_shown = TRUE; - } + if (rover_shown == FALSE) { + mActor_name_t blanca_cloth; + + mSP_SelectRandomItem_New(NULL, &blanca_cloth, 1, NULL, 0, mSP_KIND_CLOTH, mSP_LISTTYPE_ABC, FALSE); + mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_MASK_CAT2, blanca_cloth); + Save_Get(mask_cat).cloth_no = (blanca_cloth >= ITM_CLOTH_START && blanca_cloth < ITM_CLOTH_END) + ? (blanca_cloth - ITM_CLOTH_START) + : EMPTY_NO; + } else { + mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_GUIDE, EMPTY_NO); // Rover + } } - else { - rover_shown = TRUE; - } - - if (rover_shown == FALSE) { - mActor_name_t blanca_cloth; - - mSP_SelectRandomItem_New(NULL, &blanca_cloth, 1, NULL, 0, mSP_KIND_CLOTH, mSP_LISTTYPE_ABC, FALSE); - mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_MASK_CAT2, blanca_cloth); - Save_Get(mask_cat).cloth_no = (blanca_cloth >= ITM_CLOTH_START && blanca_cloth < ITM_CLOTH_END) ? (blanca_cloth - ITM_CLOTH_START) : EMPTY_NO; - } - else { - mNpc_RegistMaskNpc(SP_NPC_MASK_CAT2, SP_NPC_GUIDE, EMPTY_NO); // Rover - } - } } static void Scene_Proc_Player_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) { - static s16 angle_table[8] = { - DEG2SHORT_ANGLE( 0.0f), /* 0x0000 */ - DEG2SHORT_ANGLE( 45.0f), /* 0x2000 */ - DEG2SHORT_ANGLE( 90.0f), /* 0x4000 */ - DEG2SHORT_ANGLE( 135.0f), /* 0x6000 */ - DEG2SHORT_ANGLE(-180.0f), /* 0x8000 */ - DEG2SHORT_ANGLE(-135.0f), /* 0xA000 */ - DEG2SHORT_ANGLE( -90.0f), /* 0xC000 */ - DEG2SHORT_ANGLE( -45.0f) /* 0xE000 */ - }; + static s16 angle_table[mSc_DIRECT_NUM] = { + DEG2SHORT_ANGLE(0.0f), /* 0x0000 */ + DEG2SHORT_ANGLE(45.0f), /* 0x2000 */ + DEG2SHORT_ANGLE(90.0f), /* 0x4000 */ + DEG2SHORT_ANGLE(135.0f), /* 0x6000 */ + DEG2SHORT_ANGLE(-180.0f), /* 0x8000 */ + DEG2SHORT_ANGLE(-135.0f), /* 0xA000 */ + DEG2SHORT_ANGLE(-90.0f), /* 0xC000 */ + DEG2SHORT_ANGLE(-45.0f) /* 0xE000 */ + }; - Actor_data* data = scene_data->actor.data_p; + Actor_data* data = scene_data->actor.data_p; - play->player_data = data; + play->player_data = data; - /* Update player position & orientation based on the current door exit data */ - if (Common_Get(door_data).next_scene_id != 0) { - mem_copy((u8*)&data->position, (u8*)&Common_Get(door_data).exit_position, sizeof(s_xyz)); - data->rotation.y = angle_table[Common_Get(door_data).exit_orientation]; - } + /* Update player position & orientation based on the current door exit data */ + if (Common_Get(door_data).next_scene_id != 0) { + mem_copy((u8*)&data->position, (u8*)&Common_Get(door_data).exit_position, sizeof(s_xyz)); + data->rotation.y = angle_table[Common_Get(door_data).exit_orientation]; + } - data->arg = Common_Get(door_data).extra_data; - Object_Exchange_keep_new_Player(play); - mSM_Object_Exchange_keep_new_Menu(play); + data->arg = Common_Get(door_data).extra_data; + Object_Exchange_keep_new_Player(play); + mSM_Object_Exchange_keep_new_Menu(play); } static void Scene_Proc_Ctrl_Actor_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) { - s16* data = scene_data->control_actor.ctrl_actor_profile_p; + s16* data = scene_data->control_actor.ctrl_actor_profile_p; - play->ctrl_actor_data_num = scene_data->control_actor.num_ctrl_actors; - play->ctrl_actor_data = data; + play->ctrl_actor_data_num = scene_data->control_actor.num_ctrl_actors; + play->ctrl_actor_data = data; } static void Scene_Proc_Actor_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) { - Actor_data* data_p = scene_data->actor.data_p; + Actor_data* data_p = scene_data->actor.data_p; - play->actor_data_num = scene_data->actor.num_actors; - play->actor_data = data_p; + play->actor_data_num = scene_data->actor.num_actors; + play->actor_data = data_p; } -static void Scene_Proc_Object_Exchange_Bank_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) { - play->obj_bank_data_num = scene_data->object_bank.num_banks; - play->obj_bank_data = scene_data->object_bank.banks_p; +static void Scene_Proc_Object_Exchange_Bank_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) { + play->obj_bank_data_num = scene_data->object_bank.num_banks; + play->obj_bank_data = scene_data->object_bank.banks_p; } static void Scene_Proc_Door_Data_Ptr(GAME_PLAY* play, Scene_Word_u* scene_data) { - Door_data_c* data_p = scene_data->door_data.door_data_p; - - play->door_info.num_doors = scene_data->door_data.num_doors; - play->door_info.door_data_p = data_p; + Door_data_c* data_p = scene_data->door_data.door_data_p; + + play->door_info.num_doors = scene_data->door_data.num_doors; + play->door_info.door_data_p = data_p; } extern void Door_info_ct(Door_info_c* door_info) { - door_info->num_doors = 0; + door_info->num_doors = 0; } static void Scene_Proc_Sound(GAME_PLAY* play, Scene_Word_u* scene_data) { - // stubbed + // stubbed } static void set_item_info(GAME_PLAY* play, Scene_Word_Data_FieldCt_c* field_ct) { - static s16 profile_table[4] = { - mAc_PROFILE_BGITEM, - mAc_PROFILE_DUMMY, - mAc_PROFILE_BGPOLICEITEM, - mAc_PROFILE_BGPOSTITEM - }; + static s16 profile_table[4] = { mAc_PROFILE_BGITEM, mAc_PROFILE_DUMMY, mAc_PROFILE_BGPOLICEITEM, + mAc_PROFILE_BGPOSTITEM }; - int item_type = field_ct->item_type; + int item_type = field_ct->item_type; - if (item_type == 0) { - Common_Set(bg_item_profile, Common_Get(time).bgitem_profile); - } - else { - Common_Set(bg_item_profile, profile_table[item_type]); - } + if (item_type == 0) { + Common_Set(bg_item_profile, Common_Get(time).bgitem_profile); + } else { + Common_Set(bg_item_profile, profile_table[item_type]); + } - Common_Set(bg_item_type, item_type); + Common_Set(bg_item_type, item_type); } static void Scene_Proc_Field_ct(GAME_PLAY* play, Scene_Word_u* scene_data) { - mFM_SetFieldInitData(scene_data->field_ct.bg_num, scene_data->field_ct.bg_disp_size); - set_item_info(play, &scene_data->field_ct); - Common_Set(field_draw_type, scene_data->field_ct.draw_type); - Common_Set(game_started, FALSE); - Common_Set(in_initial_block, TRUE); - Common_Set(sunlight_flag, TRUE); + mFM_SetFieldInitData(scene_data->field_ct.bg_num, scene_data->field_ct.bg_disp_size); + set_item_info(play, &scene_data->field_ct); + Common_Set(field_draw_type, scene_data->field_ct.draw_type); + Common_Set(game_started, FALSE); + Common_Set(in_initial_block, TRUE); + Common_Set(sunlight_flag, TRUE); } static void Scene_Proc_MyRoom_ct(GAME_PLAY* play, Scene_Word_u* scene_data) { - mScn_ObtainMyRoomBank(play); + mScn_ObtainMyRoomBank(play); } static void Scene_Proc_ArrangeRoom_ct(GAME_PLAY* play, Scene_Word_u* scene_data) { - mScn_ObtainCarpetBank(play); + mScn_ObtainCarpetBank(play); } static void Scene_Proc_ArrangeFurniture_ct(GAME_PLAY* play, Scene_Word_u* scene_data) { - Common_Get(clip).arrange_ftr_num = scene_data->arrange_ftr_ct.arrange_ftr_num; + Common_Get(clip).arrange_ftr_num = scene_data->arrange_ftr_ct.arrange_ftr_num; } extern int goto_other_scene(GAME_PLAY* play, Door_data_c* door_data, int update_player_mode) { - PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); - int res = 0; // failed + PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); + int res = 0; // failed - if (player != NULL) { - if (play->fb_wipe_mode == 0) { - play->fb_fade_type = 2; + if (player != NULL) { + if (play->fb_wipe_mode == 0) { + play->fb_fade_type = 2; - if (door_data->wipe_type == 0) { - play->fb_wipe_type = 3; - } - else { - play->fb_wipe_type = door_data->wipe_type; - } + if (door_data->wipe_type == 0) { + play->fb_wipe_type = 3; + } else { + play->fb_wipe_type = door_data->wipe_type; + } - if (Common_Get(transition).wipe_type == 0xFF) { - Common_Get(transition).wipe_type = play->fb_wipe_type; - } + if (Common_Get(transition).wipe_type == 0xFF) { + Common_Get(transition).wipe_type = play->fb_wipe_type; + } - Common_Set(door_data, *door_data); - Common_Get(door_data).next_scene_id = door_data->next_scene_id + 1; - play->next_scene_no = door_data->next_scene_id; + Common_Set(door_data, *door_data); + Common_Get(door_data).next_scene_id = door_data->next_scene_id + 1; + play->next_scene_no = door_data->next_scene_id; - if (update_player_mode) { - mPlib_request_main_invade_type1(play); - } + if (update_player_mode) { + mPlib_request_main_invade_type1(play); + } - restore_fgdata_all(play); - play->game.pad_initialized = FALSE; - res = 1; // success + restore_fgdata_all(play); + play->game.pad_initialized = FALSE; + res = 1; // success + } else { + res = 2; // already changing scenes + } } - else { - res = 2; // already changing scenes - } - } - return res; + return res; } extern int goto_next_scene(GAME_PLAY* play, int next_idx, int update_player_mode) { - int res = FALSE; + int res = FALSE; - if (play->door_info.num_doors != 0) { - res = goto_other_scene(play, play->door_info.door_data_p + next_idx, update_player_mode); - } + if (play->door_info.num_doors != 0) { + res = goto_other_scene(play, play->door_info.door_data_p + next_idx, update_player_mode); + } - return res; + return res; } extern int goto_emu_game(GAME_PLAY* play, u8 famicom_rom_id) { - PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); - int res = FALSE; + PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); + int res = FALSE; - if (player != NULL) { - Door_data_c* door_data; - - play->fb_fade_type = 3; - play->fb_wipe_type = 3; - res = TRUE; + if (player != NULL) { + Door_data_c* door_data; - door_data = Common_GetPointer(famicom_emu_exit_door_data); - door_data->next_scene_id = Save_Get(scene_no); - door_data->exit_orientation = 0; - door_data->exit_type = 0; - door_data->extra_data = 0; - door_data->exit_position.x = player->actor_class.world.position.x; - door_data->exit_position.y = player->actor_class.world.position.y; - door_data->exit_position.z = player->actor_class.world.position.z; - door_data->door_actor_name = EMPTY_NO; - Common_Set(current_famicom_rom, famicom_rom_id); - } + play->fb_fade_type = 3; + play->fb_wipe_type = 3; + res = TRUE; - return res; + door_data = Common_GetPointer(famicom_emu_exit_door_data); + door_data->next_scene_id = Save_Get(scene_no); + door_data->exit_orientation = 0; + door_data->exit_type = 0; + door_data->extra_data = 0; + door_data->exit_position.x = player->actor_class.world.position.x; + door_data->exit_position.y = player->actor_class.world.position.y; + door_data->exit_position.z = player->actor_class.world.position.z; + door_data->door_actor_name = EMPTY_NO; + Common_Set(current_famicom_rom, famicom_rom_id); + } + + return res; } extern void return_emu_game(GAME* game) { - mem_copy((u8*)Common_GetPointer(door_data), (u8*)Common_GetPointer(famicom_emu_exit_door_data), sizeof(Door_data_c)); // copy exit door data - Common_Get(door_data).next_scene_id = Common_Get(famicom_emu_exit_door_data).next_scene_id + 1; - game->pad_initialized = FALSE; - game_goto_next_game_play(game); - Save_Set(scene_no, Common_Get(famicom_emu_exit_door_data).next_scene_id); + mem_copy((u8*)Common_GetPointer(door_data), (u8*)Common_GetPointer(famicom_emu_exit_door_data), + sizeof(Door_data_c)); // copy exit door data + Common_Get(door_data).next_scene_id = Common_Get(famicom_emu_exit_door_data).next_scene_id + 1; + game->pad_initialized = FALSE; + game_goto_next_game_play(game); + Save_Set(scene_no, Common_Get(famicom_emu_exit_door_data).next_scene_id); } diff --git a/src/m_soncho.c b/src/m_soncho.c index 0cfa5261..e9464b80 100644 --- a/src/m_soncho.c +++ b/src/m_soncho.c @@ -13,1167 +13,1086 @@ #include "m_player_lib.h" static u8 event_table[mSC_EVENT_NUM] = { - mEv_EVENT_SONCHO_NEW_YEARS_DAY, - mEv_EVENT_SONCHO_FOUNDERS_DAY, - mEv_EVENT_SONCHO_GRADUATION_DAY, - mEv_EVENT_SONCHO_APRILFOOLS_DAY, - mEv_EVENT_SONCHO_TOWN_DAY, - mEv_EVENT_SONCHO_MOTHERS_DAY, - mEv_EVENT_SONCHO_SALE_DAY, - mEv_EVENT_SONCHO_CHERRY_BLOSSOM_FESTIVAL, - mEv_EVENT_SONCHO_SPRING_SPORTS_FAIR, - mEv_EVENT_SONCHO_NATURE_DAY, - mEv_EVENT_SONCHO_SPRING_CLEANING, - mEv_EVENT_SONCHO_FATHERS_DAY, - mEv_EVENT_SONCHO_FISHING_TOURNEY_1, - mEv_EVENT_SONCHO_GROUNDHOG_DAY, - mEv_EVENT_SONCHO_EXPLORERS_DAY, - mEv_EVENT_SONCHO_FIREWORKS_SHOW, - mEv_EVENT_METEOR_SHOWER, - mEv_EVENT_HARVEST_MOON_FESTIVAL, - mEv_EVENT_SONCHO_MAYORS_DAY, - mEv_EVENT_SONCHO_OFFICERS_DAY, - mEv_EVENT_SONCHO_FALL_SPORTS_FAIR, - mEv_EVENT_SONCHO_HALLOWEEN, - mEv_EVENT_SONCHO_FISHING_TOURNEY_2, - mEv_EVENT_SONCHO_SNOW_DAY, - mEv_EVENT_SONCHO_LABOR_DAY, - mEv_EVENT_SONCHO_TOY_DAY, - mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, - mEv_EVENT_SONCHO_HARVEST_FESTIVAL + mEv_EVENT_SONCHO_NEW_YEARS_DAY, + mEv_EVENT_SONCHO_FOUNDERS_DAY, + mEv_EVENT_SONCHO_GRADUATION_DAY, + mEv_EVENT_SONCHO_APRILFOOLS_DAY, + mEv_EVENT_SONCHO_TOWN_DAY, + mEv_EVENT_SONCHO_MOTHERS_DAY, + mEv_EVENT_SONCHO_SALE_DAY, + mEv_EVENT_SONCHO_CHERRY_BLOSSOM_FESTIVAL, + mEv_EVENT_SONCHO_SPRING_SPORTS_FAIR, + mEv_EVENT_SONCHO_NATURE_DAY, + mEv_EVENT_SONCHO_SPRING_CLEANING, + mEv_EVENT_SONCHO_FATHERS_DAY, + mEv_EVENT_SONCHO_FISHING_TOURNEY_1, + mEv_EVENT_SONCHO_GROUNDHOG_DAY, + mEv_EVENT_SONCHO_EXPLORERS_DAY, + mEv_EVENT_SONCHO_FIREWORKS_SHOW, + mEv_EVENT_METEOR_SHOWER, + mEv_EVENT_HARVEST_MOON_FESTIVAL, + mEv_EVENT_SONCHO_MAYORS_DAY, + mEv_EVENT_SONCHO_OFFICERS_DAY, + mEv_EVENT_SONCHO_FALL_SPORTS_FAIR, + mEv_EVENT_SONCHO_HALLOWEEN, + mEv_EVENT_SONCHO_FISHING_TOURNEY_2, + mEv_EVENT_SONCHO_SNOW_DAY, + mEv_EVENT_SONCHO_LABOR_DAY, + mEv_EVENT_SONCHO_TOY_DAY, + mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, + mEv_EVENT_SONCHO_HARVEST_FESTIVAL, }; extern u8 mSC_get_soncho_event() { - u8* event_table_p = event_table; - int i = 0; + u8* event_table_p = event_table; + int i = 0; - for (i = 0; i < mSC_EVENT_NUM; i++) { - if (i != mSC_EVENT_FISHING_TOURNEY_2 && mEv_check_status(event_table[i], mEv_STATUS_RUN) != FALSE) { - return i; + for (i = 0; i < mSC_EVENT_NUM; i++) { + if (i != mSC_EVENT_FISHING_TOURNEY_2 && mEv_check_status(event_table[i], mEv_STATUS_RUN) != FALSE) { + return i; + } } - } - if (mEv_check_status(mEv_EVENT_SONCHO_FISHING_TOURNEY_2, mEv_STATUS_RUN)) { - return mSC_EVENT_FISHING_TOURNEY_2; - } + if (mEv_check_status(mEv_EVENT_SONCHO_FISHING_TOURNEY_2, mEv_STATUS_RUN)) { + return mSC_EVENT_FISHING_TOURNEY_2; + } - if (mEv_check_status(mEv_EVENT_SONCHO_VACATION_JANUARY, mEv_STATUS_RUN)) { - return mSC_SPECIAL_EVENT_JAN_VACATION; - } + if (mEv_check_status(mEv_EVENT_SONCHO_VACATION_JANUARY, mEv_STATUS_RUN)) { + return mSC_SPECIAL_EVENT_JAN_VACATION; + } - if (mEv_check_status(mEv_EVENT_SONCHO_VACATION_FEBRUARY, mEv_STATUS_RUN)) { - return mSC_SPECIAL_EVENT_FEB_VACATION; - } + if (mEv_check_status(mEv_EVENT_SONCHO_VACATION_FEBRUARY, mEv_STATUS_RUN)) { + return mSC_SPECIAL_EVENT_FEB_VACATION; + } - if (mEv_check_status(mEv_EVENT_MORNING_AEROBICS, mEv_STATUS_RUN)) { - return mSC_SPECIAL_EVENT_MORNING_AEROBICS; - } + if (mEv_check_status(mEv_EVENT_MORNING_AEROBICS, mEv_STATUS_RUN)) { + return mSC_SPECIAL_EVENT_MORNING_AEROBICS; + } - return 0xFF; + return 0xFF; } extern int mSC_get_soncho_field_event() { - if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, mEv_STATUS_RUN)) { - return mSC_FIELD_EVENT_FOOT_RACE; - } + if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, mEv_STATUS_RUN)) { + return mSC_FIELD_EVENT_FOOT_RACE; + } - if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, mEv_STATUS_RUN)) { - return mSC_FIELD_EVENT_BALL_TOSS; - } + if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, mEv_STATUS_RUN)) { + return mSC_FIELD_EVENT_BALL_TOSS; + } - if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, mEv_STATUS_RUN)) { - return mSC_FIELD_EVENT_TUG_O_WAR; - } + if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, mEv_STATUS_RUN)) { + return mSC_FIELD_EVENT_TUG_O_WAR; + } - return mSC_FIELD_EVENT_AEROBICS; // mEv_EVENT_SPORTS_FAIR_AEROBICS + return mSC_FIELD_EVENT_AEROBICS; // mEv_EVENT_SPORTS_FAIR_AEROBICS } extern void mSC_delete_soncho(ACTOR* actor, GAME_PLAY* play) { - u8 event = mSC_get_soncho_event(); + u8 event = mSC_get_soncho_event(); switch (event) { - case mSC_EVENT_NEW_YEARS_DAY: - { - ACTOR* ev_miko = Actor_info_name_search(&play->actor_info, mAc_PROFILE_EV_MIKO, ACTOR_PART_NPC); + case mSC_EVENT_NEW_YEARS_DAY: { + ACTOR* ev_miko = Actor_info_name_search(&play->actor_info, mAc_PROFILE_EV_MIKO, ACTOR_PART_NPC); - if (ev_miko != NULL) { - Actor_delete(ev_miko); + if (ev_miko != NULL) { + Actor_delete(ev_miko); + } + + break; } - break; - } - - case mSC_EVENT_FOUNDERS_DAY: - case mSC_EVENT_GRADUATION_DAY: - case mSC_EVENT_APRILFOOLS_DAY: - case mSC_EVENT_TOWN_DAY: - case mSC_EVENT_MOTHERS_DAY: - case mSC_EVENT_SALE_DAY: - case mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL: - case mSC_EVENT_NATURE_DAY: - case mSC_EVENT_SPRING_CLEANING: - case mSC_EVENT_FATHERS_DAY: - case mSC_EVENT_FISHING_TOURNEY_1: - case mSC_EVENT_GROUNDHOG_DAY: - case mSC_EVENT_EXPLORERS_DAY: - case mSC_EVENT_FIREWORKS_SHOW: - case mSC_EVENT_METEOR_SHOWER: - case mSC_EVENT_HARVEST_MOON_FESTIVAL: - case mSC_EVENT_MAYORS_DAY: - case mSC_EVENT_OFFICERS_DAY: - case mSC_EVENT_HALLOWEEN: - case mSC_EVENT_FISHING_TOURNEY_2: - case mSC_EVENT_SNOW_DAY: - case mSC_EVENT_LABOR_DAY: - case mSC_EVENT_TOY_DAY: - case mSC_EVENT_NEW_YEARS_EVE_COUNTDOWN: - case mSC_EVENT_HARVEST_FESTIVAL: - { - mEv_actor_dying_message(event_table[event], actor); - break; - } - - case mSC_EVENT_SPRING_SPORTS_FAIR: - case mSC_EVENT_FALL_SPORTS_FAIR: - { - if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, mEv_STATUS_SHOW)) { - mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, actor); - } - else if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, mEv_STATUS_SHOW)) { - mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, actor); - } - else if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, mEv_STATUS_SHOW)) { - mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, actor); + case mSC_EVENT_FOUNDERS_DAY: + case mSC_EVENT_GRADUATION_DAY: + case mSC_EVENT_APRILFOOLS_DAY: + case mSC_EVENT_TOWN_DAY: + case mSC_EVENT_MOTHERS_DAY: + case mSC_EVENT_SALE_DAY: + case mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL: + case mSC_EVENT_NATURE_DAY: + case mSC_EVENT_SPRING_CLEANING: + case mSC_EVENT_FATHERS_DAY: + case mSC_EVENT_FISHING_TOURNEY_1: + case mSC_EVENT_GROUNDHOG_DAY: + case mSC_EVENT_EXPLORERS_DAY: + case mSC_EVENT_FIREWORKS_SHOW: + case mSC_EVENT_METEOR_SHOWER: + case mSC_EVENT_HARVEST_MOON_FESTIVAL: + case mSC_EVENT_MAYORS_DAY: + case mSC_EVENT_OFFICERS_DAY: + case mSC_EVENT_HALLOWEEN: + case mSC_EVENT_FISHING_TOURNEY_2: + case mSC_EVENT_SNOW_DAY: + case mSC_EVENT_LABOR_DAY: + case mSC_EVENT_TOY_DAY: + case mSC_EVENT_NEW_YEARS_EVE_COUNTDOWN: + case mSC_EVENT_HARVEST_FESTIVAL: { + mEv_actor_dying_message(event_table[event], actor); + break; } - break; - } + case mSC_EVENT_SPRING_SPORTS_FAIR: + case mSC_EVENT_FALL_SPORTS_FAIR: { + if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, mEv_STATUS_SHOW)) { + mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_BALL_TOSS, actor); + } else if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, mEv_STATUS_SHOW)) { + mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_FOOT_RACE, actor); + } else if (mEv_check_status(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, mEv_STATUS_SHOW)) { + mEv_actor_dying_message(mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR, actor); + } - case mSC_SPECIAL_EVENT_JAN_VACATION: - { - mEv_actor_dying_message(mEv_EVENT_SONCHO_VACATION_JANUARY, actor); - break; - } + break; + } - case mSC_SPECIAL_EVENT_FEB_VACATION: - { - mEv_actor_dying_message(mEv_EVENT_SONCHO_VACATION_FEBRUARY, actor); - break; - } + case mSC_SPECIAL_EVENT_JAN_VACATION: { + mEv_actor_dying_message(mEv_EVENT_SONCHO_VACATION_JANUARY, actor); + break; + } - case 0xFF: - { - break; - } + case mSC_SPECIAL_EVENT_FEB_VACATION: { + mEv_actor_dying_message(mEv_EVENT_SONCHO_VACATION_FEBRUARY, actor); + break; + } + + case 0xFF: { + break; + } } } extern int mSC_trophy_get(u8 num) { - int res = FALSE; + int res = FALSE; - if (num <= mSC_TROPHY_MAX) { - if (num >= mSC_EVENT_NUM) { - if ((Common_Get(now_private)->soncho_trophy_field1 & (1 << (u8)(num - mSC_EVENT_NUM))) != 0) { - res = TRUE; - } + if (num <= mSC_TROPHY_MAX) { + if (num >= mSC_EVENT_NUM) { + if ((Common_Get(now_private)->soncho_trophy_field1 & (1 << (u8)(num - mSC_EVENT_NUM))) != 0) { + res = TRUE; + } + } else if ((Common_Get(now_private)->soncho_trophy_field0 & (1 << num)) != 0) { + res = TRUE; + } } - else if ((Common_Get(now_private)->soncho_trophy_field0 & (1 << num)) != 0) { - res = TRUE; - } - } - return res; + return res; } extern void mSC_trophy_set(u8 num) { - if (num > mSC_TROPHY_MAX) { - return; - } + if (num > mSC_TROPHY_MAX) { + return; + } - if (num >= mSC_EVENT_NUM) { - Common_Get(now_private)->soncho_trophy_field1 |= (1 << (u8)(num - mSC_EVENT_NUM)); - } - else { - Common_Get(now_private)->soncho_trophy_field0 |= (1 << num); - } + if (num >= mSC_EVENT_NUM) { + Common_Get(now_private)->soncho_trophy_field1 |= (1 << (u8)(num - mSC_EVENT_NUM)); + } else { + Common_Get(now_private)->soncho_trophy_field0 |= (1 << num); + } } extern mActor_name_t mSC_trophy_item(u8 soncho_event) { - static mActor_name_t soncho_item_table[mSC_EVENT_NUM] = { - ITM_FOOD_APPLE, // mSC_EVENT_NEW_YEARS_DAY - FTR_WEED_MODEL, // mSC_EVENT_FOUNDERS_DAY - FTR_NEEDLEWORK_MODEL, // mSC_EVENT_GRADUATION_DAY - FTR_SUPER_TORTIMER, // mSC_EVENT_APRILFOOLS_DAY - ITM_FOOD_APPLE, // mSC_EVENT_TOWN_DAY - FTR_LOVELY_PHONE, // mSC_EVENT_MOTHERS_DAY - FTR_MARKET_MODEL, // mSC_EVENT_SALE_DAY - FTR_PINK_TREE_MODEL, // mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL - FTR_SPRING_MEDAL, // mSC_EVENT_SPRING_SPORTS_FAIR - FTR_TREE_MODEL, // mSC_EVENT_NATURE_DAY - FTR_DUMP_MODEL, // mSC_EVENT_SPRING_CLEANING - FTR_LOCOMOTIVE_MODEL, // mSC_EVENT_FATHERS_DAY - FTR_ANGLER_TROPHY, // mSC_EVENT_FISHING_TOURNEY_1 - ITM_FOOD_PEAR, // mSC_EVENT_GROUNDHOG_DAY - FTR_BOTTLED_SHIP, // mSC_EVENT_EXPLORERS_DAY - FTR_BOTTLE_ROCKET, // mSC_EVENT_FIREWORKS_SHOW - FTR_TELESCOPE, // mSC_EVENT_METEOR_SHOWER - FTR_MOON, // mSC_EVENT_HARVEST_MOON_FESTIVAL - FTR_WELL_MODEL, // mSC_EVENT_MAYORS_DAY - FTR_POLICE_MODEL, // mSC_EVENT_OFFICERS_DAY - FTR_AUTUMN_MEDAL, // mSC_EVENT_FALL_SPORTS_FAIR - FTR_FORTUNE_TENT_MODEL, // mSC_EVENT_HALLOWEEN - FTR_FISHING_TROPHY, // mSC_EVENT_FISHING_TOURNEY_2 - FTR_SNOWMAN, // mSC_EVENT_SNOW_DAY - FTR_SHOP_MDOEL, // mSC_EVENT_LABOR_DAY - ITM_FOOD_APPLE, // mSC_EVENT_TOY_DAY - FTR_NOISEMAKER, // mSC_EVENT_NEW_YEARS_EVE_COUNTDOWN - FTR_CORNUCOPIA // mSC_EVENT_HARVEST_FESTIVAL - }; - - mActor_name_t item = ITM_FOOD_APPLE; + static mActor_name_t soncho_item_table[mSC_EVENT_NUM] = { + ITM_FOOD_APPLE, // mSC_EVENT_NEW_YEARS_DAY + FTR_WEED_MODEL, // mSC_EVENT_FOUNDERS_DAY + FTR_NEEDLEWORK_MODEL, // mSC_EVENT_GRADUATION_DAY + FTR_SUPER_TORTIMER, // mSC_EVENT_APRILFOOLS_DAY + ITM_FOOD_APPLE, // mSC_EVENT_TOWN_DAY + FTR_LOVELY_PHONE, // mSC_EVENT_MOTHERS_DAY + FTR_MARKET_MODEL, // mSC_EVENT_SALE_DAY + FTR_PINK_TREE_MODEL, // mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL + FTR_SPRING_MEDAL, // mSC_EVENT_SPRING_SPORTS_FAIR + FTR_TREE_MODEL, // mSC_EVENT_NATURE_DAY + FTR_DUMP_MODEL, // mSC_EVENT_SPRING_CLEANING + FTR_LOCOMOTIVE_MODEL, // mSC_EVENT_FATHERS_DAY + FTR_ANGLER_TROPHY, // mSC_EVENT_FISHING_TOURNEY_1 + ITM_FOOD_PEAR, // mSC_EVENT_GROUNDHOG_DAY + FTR_BOTTLED_SHIP, // mSC_EVENT_EXPLORERS_DAY + FTR_BOTTLE_ROCKET, // mSC_EVENT_FIREWORKS_SHOW + FTR_TELESCOPE, // mSC_EVENT_METEOR_SHOWER + FTR_MOON, // mSC_EVENT_HARVEST_MOON_FESTIVAL + FTR_WELL_MODEL, // mSC_EVENT_MAYORS_DAY + FTR_POLICE_MODEL, // mSC_EVENT_OFFICERS_DAY + FTR_AUTUMN_MEDAL, // mSC_EVENT_FALL_SPORTS_FAIR + FTR_FORTUNE_TENT_MODEL, // mSC_EVENT_HALLOWEEN + FTR_FISHING_TROPHY, // mSC_EVENT_FISHING_TOURNEY_2 + FTR_SNOWMAN, // mSC_EVENT_SNOW_DAY + FTR_SHOP_MDOEL, // mSC_EVENT_LABOR_DAY + ITM_FOOD_APPLE, // mSC_EVENT_TOY_DAY + FTR_NOISEMAKER, // mSC_EVENT_NEW_YEARS_EVE_COUNTDOWN + FTR_CORNUCOPIA // mSC_EVENT_HARVEST_FESTIVAL + }; - if (soncho_event < mSC_EVENT_NUM) { - switch (soncho_event) { - case mSC_EVENT_NEW_YEARS_DAY: - { - /* @BUG - devs have another off-by-one error here, as there are 16 diaries but this can only generate the first 15 */ - #ifndef BUGFIXES - item = (RANDOM(DIARY_NUM-1) & 15) + ITM_DIARY_START; - #else - item = RANDOM(DIARY_NUM) + ITM_DIARY_START; - #endif - break; - } + mActor_name_t item = ITM_FOOD_APPLE; - case mSC_EVENT_TOY_DAY: - { - if (Common_Get(now_private)->gender == mPr_SEX_MALE) { - item = FTR_MINI_CAR; + if (soncho_event < mSC_EVENT_NUM) { + switch (soncho_event) { + case mSC_EVENT_NEW_YEARS_DAY: { +/* @BUG - devs have another off-by-one error here, as there are 16 diaries but this can only generate the first 15 */ +#ifndef BUGFIXES + item = (RANDOM(DIARY_NUM - 1) & 15) + ITM_DIARY_START; +#else + item = RANDOM(DIARY_NUM) + ITM_DIARY_START; +#endif + break; + } + + case mSC_EVENT_TOY_DAY: { + if (Common_Get(now_private)->gender == mPr_SEX_MALE) { + item = FTR_MINI_CAR; + } else { + item = FTR_DOLLY; + } + break; + } + + case mSC_EVENT_TOWN_DAY: { + item = mSP_GetRandomStationToyItemNo(); + break; + } + + case mSC_EVENT_GROUNDHOG_DAY: { + item = mRmTp_FtrIdx2FtrItemNo(0x4DE + RANDOM(9), mRmTp_DIRECT_SOUTH); // random flower model + break; + } + + case mSC_EVENT_FOUNDERS_DAY: + case mSC_EVENT_GRADUATION_DAY: + case mSC_EVENT_APRILFOOLS_DAY: + case mSC_EVENT_MOTHERS_DAY: + case mSC_EVENT_SALE_DAY: + case mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL: + case mSC_EVENT_SPRING_SPORTS_FAIR: + case mSC_EVENT_NATURE_DAY: + case mSC_EVENT_SPRING_CLEANING: + case mSC_EVENT_FATHERS_DAY: + case mSC_EVENT_FISHING_TOURNEY_1: + case mSC_EVENT_EXPLORERS_DAY: + case mSC_EVENT_FIREWORKS_SHOW: + case mSC_EVENT_METEOR_SHOWER: + case mSC_EVENT_HARVEST_MOON_FESTIVAL: + case mSC_EVENT_MAYORS_DAY: + case mSC_EVENT_OFFICERS_DAY: + case mSC_EVENT_FALL_SPORTS_FAIR: + case mSC_EVENT_HALLOWEEN: + case mSC_EVENT_FISHING_TOURNEY_2: + case mSC_EVENT_SNOW_DAY: + case mSC_EVENT_LABOR_DAY: + default: { + item = soncho_item_table[soncho_event]; + break; + } } - else { - item = FTR_DOLLY; - } - break; - } - - case mSC_EVENT_TOWN_DAY: - { - item = mSP_GetRandomStationToyItemNo(); - break; - } - - case mSC_EVENT_GROUNDHOG_DAY: - { - item = mRmTp_FtrIdx2FtrItemNo(0x4DE + RANDOM(9), mRmTp_DIRECT_SOUTH); // random flower model - break; - } - - case mSC_EVENT_FOUNDERS_DAY: - case mSC_EVENT_GRADUATION_DAY: - case mSC_EVENT_APRILFOOLS_DAY: - case mSC_EVENT_MOTHERS_DAY: - case mSC_EVENT_SALE_DAY: - case mSC_EVENT_CHERRY_BLOSSOM_FESTIVAL: - case mSC_EVENT_SPRING_SPORTS_FAIR: - case mSC_EVENT_NATURE_DAY: - case mSC_EVENT_SPRING_CLEANING: - case mSC_EVENT_FATHERS_DAY: - case mSC_EVENT_FISHING_TOURNEY_1: - case mSC_EVENT_EXPLORERS_DAY: - case mSC_EVENT_FIREWORKS_SHOW: - case mSC_EVENT_METEOR_SHOWER: - case mSC_EVENT_HARVEST_MOON_FESTIVAL: - case mSC_EVENT_MAYORS_DAY: - case mSC_EVENT_OFFICERS_DAY: - case mSC_EVENT_FALL_SPORTS_FAIR: - case mSC_EVENT_HALLOWEEN: - case mSC_EVENT_FISHING_TOURNEY_2: - case mSC_EVENT_SNOW_DAY: - case mSC_EVENT_LABOR_DAY: - default: - { - item = soncho_item_table[soncho_event]; - break; - } } - } - return item; + return item; } extern void mSC_item_string_set(mActor_name_t item, int str_no) { - u8 item_name[mIN_ITEM_NAME_LEN]; - mMsg_Window_c* window = mMsg_Get_base_window_p(); + u8 item_name[mIN_ITEM_NAME_LEN]; + mMsg_Window_c* window = mMsg_Get_base_window_p(); - mIN_copy_name_str(item_name, item); - mMsg_Set_item_str_art(window, str_no, item_name, mIN_ITEM_NAME_LEN, mIN_get_item_article(item)); + mIN_copy_name_str(item_name, item); + mMsg_Set_item_str_art(window, str_no, item_name, mIN_ITEM_NAME_LEN, mIN_get_item_article(item)); } extern void mSC_get_event_name_str(u8* buf, int buf_len, int soncho_event) { - static int chg_string_idx[mSC_EVENT_NUM + 1] = { - 0, // New Year's Day - 14, // Founder's Day - 8, // Graduation Day - 3, // April Fools' Day - 11, // "Town" Day - 7, // Mother's Day - 24, // Sale Day - 4, // Cherry Festival - 2, // Sports Fair - 5, // Nature Day - 6, // Spring Cleaning - 9, // Father's Day - 10, // Fishing Tourney - 1, // Groundhog Day - 18, // Explorer's Day - 12, // Fireworks Show - 13, // Meteor Shower - 17, // Harvest Moon - 20, // Mayor's Day - 21, // Officer's Day - 16, // Sports Fair - 19, // Halloween - 22, // Fishing Tourney - 25, // Snow Day - 15, // Labor Day - 26, // Toy Day - 27, // New Year's Eve - 23, // Harvest Festival - 28 // birthday - }; + static int chg_string_idx[mSC_EVENT_NUM + 1] = { + 0, // New Year's Day + 14, // Founder's Day + 8, // Graduation Day + 3, // April Fools' Day + 11, // "Town" Day + 7, // Mother's Day + 24, // Sale Day + 4, // Cherry Festival + 2, // Sports Fair + 5, // Nature Day + 6, // Spring Cleaning + 9, // Father's Day + 10, // Fishing Tourney + 1, // Groundhog Day + 18, // Explorer's Day + 12, // Fireworks Show + 13, // Meteor Shower + 17, // Harvest Moon + 20, // Mayor's Day + 21, // Officer's Day + 16, // Sports Fair + 19, // Halloween + 22, // Fishing Tourney + 25, // Snow Day + 15, // Labor Day + 26, // Toy Day + 27, // New Year's Eve + 23, // Harvest Festival + 28 // birthday + }; - mString_Load_StringFromRom(buf, buf_len, mString_SONCHO_EVENT_NAME_START + chg_string_idx[soncho_event & 0x7F]); + mString_Load_StringFromRom(buf, buf_len, mString_SONCHO_EVENT_NAME_START + chg_string_idx[soncho_event & 0x7F]); } extern void mSC_event_name_set(u8 soncho_event) { - u8 event_name_buf[mIN_ITEM_NAME_LEN]; - int ofs = 0; // for town day name + u8 event_name_buf[mIN_ITEM_NAME_LEN]; + int ofs = 0; // for town day name - if (soncho_event < mSC_EVENT_NUM) { - if (soncho_event == mSC_EVENT_TOWN_DAY) { - mLd_CopyLandName(event_name_buf, Save_Get(land_info).name); - ofs = mMl_strlen(event_name_buf, LAND_NAME_SIZE, CHAR_SPACE); + if (soncho_event < mSC_EVENT_NUM) { + if (soncho_event == mSC_EVENT_TOWN_DAY) { + mLd_CopyLandName(event_name_buf, Save_Get(land_info).name); + ofs = mMl_strlen(event_name_buf, LAND_NAME_SIZE, CHAR_SPACE); + } + + mSC_get_event_name_str(event_name_buf + ofs, mIN_ITEM_NAME_LEN - ofs, soncho_event); + mMsg_Set_item_str(mMsg_Get_base_window_p(), mMsg_ITEM_STR1, event_name_buf, mIN_ITEM_NAME_LEN); } - - mSC_get_event_name_str(event_name_buf + ofs, mIN_ITEM_NAME_LEN - ofs, soncho_event); - mMsg_Set_item_str(mMsg_Get_base_window_p(), mMsg_ITEM_STR1, event_name_buf, mIN_ITEM_NAME_LEN); - } } extern void mSC_set_free_str_number(int free_str_no, u32 num) { - u8 number[mIN_ITEM_NAME_LEN]; - int fig; + u8 number[mIN_ITEM_NAME_LEN]; + int fig; - if (num >= 100) { - fig = 3; - } - else if (num >= 10) { - fig = 2; - } - else { - fig = 1; - } + if (num >= 100) { + fig = 3; + } else if (num >= 10) { + fig = 2; + } else { + fig = 1; + } - mFont_UnintToString(number, 3, num, fig, TRUE, FALSE, TRUE); - mMsg_Set_free_str(mMsg_Get_base_window_p(), free_str_no, number, fig); + mFont_UnintToString(number, 3, num, fig, TRUE, FALSE, TRUE); + mMsg_Set_free_str(mMsg_Get_base_window_p(), free_str_no, number, fig); } static int mSC_Radio_many_taisou_card() { - int i; - int cards; - Private_c* priv = Common_Get(now_private); + int i; + int cards; + Private_c* priv = Common_Get(now_private); - for (i = 0, cards = 0; i < 13; i++) { - cards += mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); - } + for (i = 0, cards = 0; i < 13; i++) { + cards += mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); + } - return cards; + return cards; } static mActor_name_t mSC_Radio_have_taisou_card() { - int i; - Private_c* priv = Common_Get(now_private); + int i; + Private_c* priv = Common_Get(now_private); - for (i = 0; i < 13; i++) { - if (mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL) > 0) { - return ITM_EXCERCISE_CARD00 + i; + for (i = 0; i < 13; i++) { + if (mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL) > 0) { + return ITM_EXCERCISE_CARD00 + i; + } } - } - return ITM_EXCERCISE_CARD00; + return ITM_EXCERCISE_CARD00; } static int mSC_Radio_time_check() { - Private_c* priv = Common_Get(now_private); - int equal_date; + Private_c* priv = Common_Get(now_private); + int equal_date; - if (Common_Get(time.rtc_time).year != priv->radiocard.last_date.year) { - return 0; - } + if (Common_Get(time.rtc_time).year != priv->radiocard.last_date.year) { + return 0; + } - equal_date = lbRTC_IsEqualDate( - Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, - priv->radiocard.last_date.year, priv->radiocard.last_date.month, priv->radiocard.last_date.day - ); + equal_date = lbRTC_IsEqualDate(Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, + Common_Get(time.rtc_time).day, priv->radiocard.last_date.year, + priv->radiocard.last_date.month, priv->radiocard.last_date.day); - switch (equal_date) { - case lbRTC_LESS: - return mSC_RADIO_TIME_LESS; - case lbRTC_EQUAL: - return mSC_RADIO_TIME_SAME_DAY; - case lbRTC_OVER: - return mSC_RADIO_TIME_OVER; - default: - return mSC_RADIO_TIME_LESS; - } + switch (equal_date) { + case lbRTC_LESS: + return mSC_RADIO_TIME_LESS; + case lbRTC_EQUAL: + return mSC_RADIO_TIME_SAME_DAY; + case lbRTC_OVER: + return mSC_RADIO_TIME_OVER; + default: + return mSC_RADIO_TIME_LESS; + } } static int mSC_Radio_limit_check() { - if (Common_Get(time.rtc_time).month >= lbRTC_AUGUST && Common_Get(time.rtc_time).day >= 19) { - return FALSE; - } + if (Common_Get(time.rtc_time).month >= lbRTC_AUGUST && Common_Get(time.rtc_time).day >= 19) { + return FALSE; + } - return TRUE; + return TRUE; } static void mSC_Radio_delete_taisou_card() { - int i; - Private_c* priv = Common_Get(now_private); + int i; + Private_c* priv = Common_Get(now_private); - for (i = 0; i < 13; i++) { - int idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); - - while (idx != -1) { - mPr_SetPossessionItem(Common_Get(now_private), idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); // probably a macro - idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); + for (i = 0; i < 13; i++) { + int idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); + + while (idx != -1) { + mPr_SetPossessionItem(Common_Get(now_private), idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); // probably a macro + idx = mPr_GetPossessionItemIdxWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); + } } - } } static void mSC_Radio_change_taisou_card(mActor_name_t old_card, mActor_name_t new_card) { - Private_c* priv = Common_Get(now_private); - int idx = mPr_GetPossessionItemIdxWithCond(priv, old_card, mPr_ITEM_COND_NORMAL); + Private_c* priv = Common_Get(now_private); + int idx = mPr_GetPossessionItemIdxWithCond(priv, old_card, mPr_ITEM_COND_NORMAL); - if (idx != -1) { - mPr_SetPossessionItem(Common_Get(now_private), idx, new_card, mPr_ITEM_COND_NORMAL); // again, probably a macro - } + if (idx != -1) { + mPr_SetPossessionItem(Common_Get(now_private), idx, new_card, mPr_ITEM_COND_NORMAL); // again, probably a macro + } } static void mSC_Radio_stamp_card(lbRTC_day_t days) { - const lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; + const lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; - radiocard->last_date.year = rtc_time->year; - radiocard->last_date.month = rtc_time->month; - radiocard->last_date.day = rtc_time->day; - radiocard->days = days; + radiocard->last_date.year = rtc_time->year; + radiocard->last_date.month = rtc_time->month; + radiocard->last_date.day = rtc_time->day; + radiocard->days = days; } static int mSC_Radio_msg(TAISOU_NPC0_ACTOR* taisou_actor, int idx) { - return 0x3280 + taisou_actor->soncho_event * 10 + idx; + return 0x3280 + taisou_actor->soncho_event * 10 + idx; } extern int mSC_Radio_Set_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor) { - u8 item_name[mIN_ITEM_NAME_LEN]; - mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; - int msg_no; + u8 item_name[mIN_ITEM_NAME_LEN]; + mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; + int msg_no; - taisou_actor->talk_proc = mSCR_TALK_9; - if (taisou_actor->soncho_event == mSC_SPECIAL_EVENT_MORNING_AEROBICS) { - int time_check = mSC_Radio_time_check(); - int num_cards = mSC_Radio_many_taisou_card(); - mActor_name_t card; - int article; + taisou_actor->talk_proc = mSCR_TALK_9; + if (taisou_actor->soncho_event == mSC_SPECIAL_EVENT_MORNING_AEROBICS) { + int time_check = mSC_Radio_time_check(); + int num_cards = mSC_Radio_many_taisou_card(); + mActor_name_t card; + int article; - if (Common_Get(player_no) == mPr_FOREIGNER) { - msg_no = 0x343B; - } - else if (time_check == mSC_RADIO_TIME_SAME_DAY) { - msg_no = 0x3433; - taisou_actor->talk_state = 18 + RANDOM(3); - taisou_actor->talk_proc = mSCR_TALK_NEXT; - } - else { - int action = mSCR_ACTION_TOO_LATE; + if (Common_Get(player_no) == mPr_FOREIGNER) { + msg_no = 0x343B; + } else if (time_check == mSC_RADIO_TIME_SAME_DAY) { + msg_no = 0x3433; + taisou_actor->talk_state = 18 + RANDOM(3); + taisou_actor->talk_proc = mSCR_TALK_NEXT; + } else { + int action = mSCR_ACTION_TOO_LATE; - if (num_cards <= 0) { - int limit_check = mSC_Radio_limit_check(); + if (num_cards <= 0) { + int limit_check = mSC_Radio_limit_check(); - if (limit_check == FALSE && (radiocard->days == mSC_RADIO_DAYS || time_check == mSC_RADIO_TIME_LESS)) { - action = mSCR_ACTION_TOO_LATE; - } - else { - switch (time_check) { - case mSC_RADIO_TIME_LESS: - action = mSCR_ACTION_NEW_CARD; - break; - - case mSC_RADIO_TIME_OVER: - { - if (radiocard->days == (mSC_RADIO_DAYS - 1)) { - action = mSCR_ACTION_LOST_CARD_AND_FINISH; - } - else if (radiocard->days < mSC_RADIO_DAYS) { - action = mSCR_ACTION_LOST_CARD; - } - else { - action = mSCR_ACTION_NEW_CARD; - } - break; - } - } - } - } - else if (num_cards > 1) { - action = mSCR_ACTION_DELETE_OLD_CARD; - } - else { - card = mSC_Radio_have_taisou_card(); + if (limit_check == FALSE && (radiocard->days == mSC_RADIO_DAYS || time_check == mSC_RADIO_TIME_LESS)) { + action = mSCR_ACTION_TOO_LATE; + } else { + switch (time_check) { + case mSC_RADIO_TIME_LESS: + action = mSCR_ACTION_NEW_CARD; + break; - switch (time_check) { - case mSC_RADIO_TIME_LESS: - action = mSCR_ACTION_DELETE_OLD_CARD; - break; + case mSC_RADIO_TIME_OVER: { + if (radiocard->days == (mSC_RADIO_DAYS - 1)) { + action = mSCR_ACTION_LOST_CARD_AND_FINISH; + } else if (radiocard->days < mSC_RADIO_DAYS) { + action = mSCR_ACTION_LOST_CARD; + } else { + action = mSCR_ACTION_NEW_CARD; + } + break; + } + } + } + } else if (num_cards > 1) { + action = mSCR_ACTION_DELETE_OLD_CARD; + } else { + card = mSC_Radio_have_taisou_card(); - case mSC_RADIO_TIME_SAME_DAY: - break; + switch (time_check) { + case mSC_RADIO_TIME_LESS: + action = mSCR_ACTION_DELETE_OLD_CARD; + break; - case mSC_RADIO_TIME_OVER: - { - radiocard->days = card - ITM_EXCERCISE_CARD00; - radiocard->days++; + case mSC_RADIO_TIME_SAME_DAY: + break; - if (radiocard->days >= mSC_RADIO_DAYS) { - action = mSCR_ACTION_FINISH_CARD; - } - else { - action = mSCR_ACTION_STAMP_CARD; + case mSC_RADIO_TIME_OVER: { + radiocard->days = card - ITM_EXCERCISE_CARD00; + radiocard->days++; + + if (radiocard->days >= mSC_RADIO_DAYS) { + action = mSCR_ACTION_FINISH_CARD; + } else { + action = mSCR_ACTION_STAMP_CARD; + } + + break; + } + } } - break; - } - } - } + switch (action) { + case mSCR_ACTION_TOO_LATE: { + msg_no = 0x3437; + taisou_actor->talk_state = 22 + RANDOM(3); + taisou_actor->talk_proc = mSCR_TALK_NEXT; + break; + } - switch (action) { - case mSCR_ACTION_TOO_LATE: - { - msg_no = 0x3437; - taisou_actor->talk_state = 22 + RANDOM(3); - taisou_actor->talk_proc = mSCR_TALK_NEXT; - break; + case mSCR_ACTION_DELETE_OLD_CARD: { + taisou_actor->talk_proc = mSCR_TALK_PICKUP_ALL; + msg_no = 0x343C; + mSC_Radio_delete_taisou_card(); + break; + } + + case mSCR_ACTION_NEW_CARD: { + taisou_actor->talk_state = mSCR_TALK_NEXT_INSPECTION; + msg_no = 0x3422; + + if (mCD_calendar_event_check(Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, + Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event)) { + msg_no = 0x3423; + } + + if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, + mPr_ITEM_COND_NORMAL) == 0) { + taisou_actor->talk_proc = mSCR_TALK_NEXT; + } else { + taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; + taisou_actor->held_item = ITM_EXCERCISE_CARD00; + mPr_SetFreePossessionItem(Common_Get(now_private), ITM_EXCERCISE_CARD00, mPr_ITEM_COND_NORMAL); + mSC_Radio_stamp_card(0); + taisou_actor->talk_state++; + } + + break; + } + + case mSCR_ACTION_LOST_CARD: { + taisou_actor->talk_state = 14; + msg_no = 0x342E; + mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 2); + + if (mCD_calendar_event_check(Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, + Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event)) { + msg_no = 0x342F; + } + + if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, + mPr_ITEM_COND_NORMAL) == 0) { + taisou_actor->talk_proc = mSCR_TALK_NEXT; + } else { + taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; + radiocard->days++; + taisou_actor->held_item = ITM_EXCERCISE_CARD00 + radiocard->days; + mPr_SetFreePossessionItem(Common_Get(now_private), taisou_actor->held_item, + mPr_ITEM_COND_NORMAL); + mSC_Radio_stamp_card(radiocard->days); + taisou_actor->talk_state++; + } + + break; + } + + case mSCR_ACTION_STAMP_CARD: { + taisou_actor->talk_proc = mSCR_TALK_INSPECTION; + card = mSC_Radio_have_taisou_card(); + mSC_Radio_stamp_card(radiocard->days); + mSC_Radio_change_taisou_card(card, ITM_EXCERCISE_CARD00 + radiocard->days); + mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 1); + taisou_actor->talk_state = mSCR_TALK_NEXT; + msg_no = 0x3427; + + break; + } + + case mSCR_ACTION_FINISH_CARD: { + taisou_actor->talk_proc = mSCR_TALK_INSPECTION; + card = mSC_Radio_have_taisou_card(); + mSC_Radio_stamp_card(radiocard->days); + taisou_actor->held_item = FTR_AEROBICS_RADIO; + mSC_Radio_change_taisou_card(card, taisou_actor->held_item); + mIN_copy_name_str(item_name, taisou_actor->held_item); + article = mIN_get_item_article(taisou_actor->held_item); + mMsg_Set_free_str_art(mMsg_Get_base_window_p(), mMsg_FREE_STR1, item_name, mIN_ITEM_NAME_LEN, + article); + taisou_actor->talk_state = 9; + msg_no = 0x342A; + + break; + } + + case mSCR_ACTION_LOST_CARD_AND_FINISH: { + taisou_actor->talk_state = 28; + msg_no = 0x342E; + mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 2); + + if (mCD_calendar_event_check(Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, + Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event)) { + msg_no = 0x342F; + } + + if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, + mPr_ITEM_COND_NORMAL) == 0) { + taisou_actor->talk_proc = mSCR_TALK_NEXT; + } else { + taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; + radiocard->days++; + taisou_actor->held_item = FTR_AEROBICS_RADIO; + mPr_SetFreePossessionItem(Common_Get(now_private), taisou_actor->held_item, + mPr_ITEM_COND_NORMAL); + mIN_copy_name_str(item_name, taisou_actor->held_item); + article = mIN_get_item_article(taisou_actor->held_item); + mMsg_Set_free_str_art(mMsg_Get_base_window_p(), mMsg_FREE_STR1, item_name, mIN_ITEM_NAME_LEN, + article); + mSC_Radio_stamp_card(radiocard->days); + taisou_actor->talk_state--; + } + + break; + } + + default: { + msg_no = 0x3437; + taisou_actor->talk_state = 22 + RANDOM(3); + taisou_actor->talk_proc = mSCR_TALK_NEXT; + break; + } + } + } + } else if (Common_Get(player_no) == mPr_FOREIGNER) { + msg_no = mSC_Radio_msg(taisou_actor, 9); + taisou_actor->talk_proc = mSCR_TALK_8; + } else if (mSC_trophy_get(taisou_actor->soncho_event) != FALSE) { + if (mCD_calendar_event_check(Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, + Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event)) { + msg_no = mSC_Radio_msg(taisou_actor, 6 + RANDOM(3)); + } else { + msg_no = mSC_Radio_msg(taisou_actor, 5); } - case mSCR_ACTION_DELETE_OLD_CARD: - { - taisou_actor->talk_proc = mSCR_TALK_PICKUP_ALL; - msg_no = 0x343C; - mSC_Radio_delete_taisou_card(); - break; + taisou_actor->talk_proc = mSCR_TALK_7; + } else { + taisou_actor->talk_proc = mSCR_TALK_BEFORE_GIVE; + + if (mCD_calendar_event_check(Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, + Common_Get(time.rtc_time).day, -1, taisou_actor->soncho_event)) { + msg_no = mSC_Radio_msg(taisou_actor, 1); + } else { + msg_no = mSC_Radio_msg(taisou_actor, 0); } - - case mSCR_ACTION_NEW_CARD: - { - taisou_actor->talk_state = mSCR_TALK_NEXT_INSPECTION; - msg_no = 0x3422; - - if ( - mCD_calendar_event_check( - Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, - -1, taisou_actor->soncho_event - ) - ) { - msg_no = 0x3423; - } - - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { - taisou_actor->talk_proc = mSCR_TALK_NEXT; - } - else { - taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; - taisou_actor->held_item = ITM_EXCERCISE_CARD00; - mPr_SetFreePossessionItem(Common_Get(now_private), ITM_EXCERCISE_CARD00, mPr_ITEM_COND_NORMAL); - mSC_Radio_stamp_card(0); - taisou_actor->talk_state++; - } - - break; - } - - case mSCR_ACTION_LOST_CARD: - { - taisou_actor->talk_state = 14; - msg_no = 0x342E; - mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 2); - - if ( - mCD_calendar_event_check( - Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, - -1, taisou_actor->soncho_event - ) - ) { - msg_no = 0x342F; - } - - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { - taisou_actor->talk_proc = mSCR_TALK_NEXT; - } - else { - taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; - radiocard->days++; - taisou_actor->held_item = ITM_EXCERCISE_CARD00 + radiocard->days; - mPr_SetFreePossessionItem(Common_Get(now_private), taisou_actor->held_item, mPr_ITEM_COND_NORMAL); - mSC_Radio_stamp_card(radiocard->days); - taisou_actor->talk_state++; - } - - break; - } - - case mSCR_ACTION_STAMP_CARD: - { - taisou_actor->talk_proc = mSCR_TALK_INSPECTION; - card = mSC_Radio_have_taisou_card(); - mSC_Radio_stamp_card(radiocard->days); - mSC_Radio_change_taisou_card(card, ITM_EXCERCISE_CARD00 + radiocard->days); - mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 1); - taisou_actor->talk_state = mSCR_TALK_NEXT; - msg_no = 0x3427; - - break; - } - - case mSCR_ACTION_FINISH_CARD: - { - taisou_actor->talk_proc = mSCR_TALK_INSPECTION; - card = mSC_Radio_have_taisou_card(); - mSC_Radio_stamp_card(radiocard->days); - taisou_actor->held_item = FTR_AEROBICS_RADIO; - mSC_Radio_change_taisou_card(card, taisou_actor->held_item); - mIN_copy_name_str(item_name, taisou_actor->held_item); - article = mIN_get_item_article(taisou_actor->held_item); - mMsg_Set_free_str_art(mMsg_Get_base_window_p(), mMsg_FREE_STR1, item_name, mIN_ITEM_NAME_LEN, article); - taisou_actor->talk_state = 9; - msg_no = 0x342A; - - break; - } - - case mSCR_ACTION_LOST_CARD_AND_FINISH: - { - taisou_actor->talk_state = 28; - msg_no = 0x342E; - mSC_set_free_str_number(mMsg_FREE_STR0, radiocard->days + 2); - - if ( - mCD_calendar_event_check( - Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, - -1, taisou_actor->soncho_event - ) - ) { - msg_no = 0x342F; - } - - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { - taisou_actor->talk_proc = mSCR_TALK_NEXT; - } - else { - taisou_actor->talk_proc = mSCR_TALK_NEXT_INSPECTION; - radiocard->days++; - taisou_actor->held_item = FTR_AEROBICS_RADIO; - mPr_SetFreePossessionItem(Common_Get(now_private), taisou_actor->held_item, mPr_ITEM_COND_NORMAL); - mIN_copy_name_str(item_name, taisou_actor->held_item); - article = mIN_get_item_article(taisou_actor->held_item); - mMsg_Set_free_str_art(mMsg_Get_base_window_p(), mMsg_FREE_STR1, item_name, mIN_ITEM_NAME_LEN, article); - mSC_Radio_stamp_card(radiocard->days); - taisou_actor->talk_state--; - } - - break; - } - - default: - { - msg_no = 0x3437; - taisou_actor->talk_state = 22 + RANDOM(3); - taisou_actor->talk_proc = mSCR_TALK_NEXT; - break; - } - } - } - } - else if (Common_Get(player_no) == mPr_FOREIGNER) { - msg_no = mSC_Radio_msg(taisou_actor, 9); - taisou_actor->talk_proc = mSCR_TALK_8; - } - else if (mSC_trophy_get(taisou_actor->soncho_event) != FALSE) { - if ( - mCD_calendar_event_check( - Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, - -1, taisou_actor->soncho_event - ) - ) { - msg_no = mSC_Radio_msg(taisou_actor, 6 + RANDOM(3)); - } - else { - msg_no = mSC_Radio_msg(taisou_actor, 5); } - taisou_actor->talk_proc = mSCR_TALK_7; - } - else { - taisou_actor->talk_proc = mSCR_TALK_BEFORE_GIVE; - - if ( - mCD_calendar_event_check( - Common_Get(time.rtc_time).year, Common_Get(time.rtc_time).month, Common_Get(time.rtc_time).day, - -1, taisou_actor->soncho_event - ) - ) { - msg_no = mSC_Radio_msg(taisou_actor, 1); - } - else { - msg_no = mSC_Radio_msg(taisou_actor, 0); - } - } - - return msg_no; + return msg_no; } static void mSCR_talk_pickup_all(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - switch (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9)) { - case 1: - { - mPlib_request_main_give_type1((GAME*)play, ITM_EXCERCISE_CARD00, 7, FALSE, FALSE); - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); - mMsg_Set_LockContinue(mMsg_Get_base_window_p()); - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); - break; - } + switch (mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9)) { + case 1: { + mPlib_request_main_give_type1((GAME*)play, ITM_EXCERCISE_CARD00, 7, FALSE, FALSE); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); + mMsg_Set_LockContinue(mMsg_Get_base_window_p()); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); + break; + } - case 2: - { - if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { - mMsg_Unset_LockContinue(mMsg_Get_base_window_p()); - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - taisou_actor->talk_proc = mSCR_TALK_9; - } + case 2: { + if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { + mMsg_Unset_LockContinue(mMsg_Get_base_window_p()); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + taisou_actor->talk_proc = mSCR_TALK_9; + } - break; + break; + } } - } } static void mSCR_talk_inspection(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 9); + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + mPr_day_day_c* radiocard = &Common_Get(now_private)->radiocard; - switch (order) { - case 1: - { - mPlib_request_main_give_type1((GAME*)play, ITM_EXCERCISE_CARD00, 8, FALSE, FALSE); - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); - mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); - taisou_actor->talk_state++; - break; - } - - case 2: - { - if (Common_Get(clip).handOverItem_clip->request_mode == aHOI_REQUEST_TRANS_WAIT) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); - Common_Get(clip).handOverItem_clip->player_after_mode = 8; - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 3); - mMsg_Unset_LockContinue(msg_win); - taisou_actor->npc_actor_class.talk_info.default_animation = 30; - } - break; - } - - case 3: - { - if ((mMsg_Get_msg_num(msg_win) == 0x342B || mMsg_Get_msg_num(msg_win) == 0x3428) && mMsg_Check_MainNormalContinue(msg_win)) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 4); - mMsg_Set_LockContinue(mMsg_Get_base_window_p()); - } - - break; - } - - case 4: - { - if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { - taisou_actor->npc_actor_class.talk_info.default_animation = -1; - mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); - - if (radiocard->days >= mSC_RADIO_DAYS) { - taisou_actor->talk_proc = mSCR_TALK_NEWCARD; - } - else { - taisou_actor->talk_proc = mSCR_TALK_9; + switch (order) { + case 1: { + mPlib_request_main_give_type1((GAME*)play, ITM_EXCERCISE_CARD00, 8, FALSE, FALSE); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 2); + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); + mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); + taisou_actor->talk_state++; + break; } - mMsg_Unset_LockContinue(msg_win); - mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); - taisou_actor->talk_state++; - } + case 2: { + if (Common_Get(clip).handOverItem_clip->request_mode == aHOI_REQUEST_TRANS_WAIT) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 1, 3); + Common_Get(clip).handOverItem_clip->player_after_mode = 8; + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 3); + mMsg_Unset_LockContinue(msg_win); + taisou_actor->npc_actor_class.talk_info.default_animation = 30; + } + break; + } - break; + case 3: { + if ((mMsg_Get_msg_num(msg_win) == 0x342B || mMsg_Get_msg_num(msg_win) == 0x3428) && + mMsg_Check_MainNormalContinue(msg_win)) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 4); + mMsg_Set_LockContinue(mMsg_Get_base_window_p()); + } + + break; + } + + case 4: { + if (Common_Get(clip).handOverItem_clip->master_actor == NULL) { + taisou_actor->npc_actor_class.talk_info.default_animation = -1; + mDemo_Set_OrderValue(mDemo_ORDER_NPC0, 9, 0); + + if (radiocard->days >= mSC_RADIO_DAYS) { + taisou_actor->talk_proc = mSCR_TALK_NEWCARD; + } else { + taisou_actor->talk_proc = mSCR_TALK_9; + } + + mMsg_Unset_LockContinue(msg_win); + mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); + taisou_actor->talk_state++; + } + + break; + } } - } } static void mSCR_talk_newcard(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (order == 2) { - mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, taisou_actor->held_item); - mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); - mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); + if (order == 2) { + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, taisou_actor->held_item); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); - if (taisou_actor->talk_state == 28) { - mMsg_Set_continue_msg_num(msg_win, 0x342D); /* dialog after giving aerobics radio */ + if (taisou_actor->talk_state == 28) { + mMsg_Set_continue_msg_num(msg_win, 0x342D); /* dialog after giving aerobics radio */ + } else { + mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); + taisou_actor->talk_state++; + } + + taisou_actor->talk_proc = mSCR_TALK_9; } - else { - mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); - taisou_actor->talk_state++; - } - - taisou_actor->talk_proc = mSCR_TALK_9; - } } static void mSCR_talk_before_give(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - if (mMsg_Check_MainNormalContinue(msg_win)) { - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { - mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 2)); - taisou_actor->talk_proc = mSCR_TALK_9; + if (mMsg_Check_MainNormalContinue(msg_win)) { + if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { + mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 2)); + taisou_actor->talk_proc = mSCR_TALK_9; + } else { + mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 3)); + taisou_actor->talk_proc = mSCR_TALK_GIVE; + } } - else { - mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 3)); - taisou_actor->talk_proc = mSCR_TALK_GIVE; - } - } } static void mSCR_talk_give(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); + int order = mDemo_Get_OrderValue(mDemo_ORDER_NPC0, 1); - if (order == 2) { - mActor_name_t trophy_item = mSC_trophy_item(taisou_actor->soncho_event); + if (order == 2) { + mActor_name_t trophy_item = mSC_trophy_item(taisou_actor->soncho_event); - mSC_item_string_set(trophy_item, mMsg_ITEM_STR0); - mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, trophy_item); - mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); - mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); - mPr_SetFreePossessionItem(Common_Get(now_private), trophy_item, mPr_ITEM_COND_NORMAL); - mSC_trophy_set(taisou_actor->soncho_event); - taisou_actor->talk_proc = mSCR_TALK_9; - } + mSC_item_string_set(trophy_item, mMsg_ITEM_STR0); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 0, trophy_item); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 1, 7); + mDemo_Set_OrderValue(mDemo_ORDER_NPC1, 2, 0); + mPr_SetFreePossessionItem(Common_Get(now_private), trophy_item, mPr_ITEM_COND_NORMAL); + mSC_trophy_set(taisou_actor->soncho_event); + taisou_actor->talk_proc = mSCR_TALK_9; + } } static void mSCR_talk_next(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); - - if (mMsg_Check_MainNormalContinue(msg_win)) { - mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); - taisou_actor->talk_proc++; - taisou_actor->talk_state++; - } + mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); + + if (mMsg_Check_MainNormalContinue(msg_win)) { + mMsg_Set_continue_msg_num(msg_win, 0x3422 + taisou_actor->talk_state); + taisou_actor->talk_proc++; + taisou_actor->talk_state++; + } } typedef void (*mSCR_TALK_PROC)(TAISOU_NPC0_ACTOR*, GAME_PLAY*); extern mSC_Radio_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* play) { - static mSCR_TALK_PROC proc[mSCR_TALK_NUM] = { - &mSCR_talk_pickup_all, - &mSCR_talk_inspection, - &mSCR_talk_next, - &mSCR_talk_newcard, - &mSCR_talk_before_give, - &mSCR_talk_give, - &mSCR_talk_next, - (mSCR_TALK_PROC)&none_proc1, - (mSCR_TALK_PROC)&none_proc1, - (mSCR_TALK_PROC)&none_proc1 - }; + static mSCR_TALK_PROC proc[mSCR_TALK_NUM] = { &mSCR_talk_pickup_all, + &mSCR_talk_inspection, + &mSCR_talk_next, + &mSCR_talk_newcard, + &mSCR_talk_before_give, + &mSCR_talk_give, + &mSCR_talk_next, + (mSCR_TALK_PROC)&none_proc1, + (mSCR_TALK_PROC)&none_proc1, + (mSCR_TALK_PROC)&none_proc1 }; - (*proc[taisou_actor->talk_proc])(taisou_actor, play); + (*proc[taisou_actor->talk_proc])(taisou_actor, play); } extern int mSC_LightHouse_get_period(lbRTC_time_c* time) { - lbRTC_time_c lh_start_time; - lbRTC_time_c lh_end_time; - lbRTC_time_c lh_max_time; - lbRTC_ymd_c* renew_time = &Save_Get(LightHouse).renew_time; - int equal; + lbRTC_time_c lh_start_time; + lbRTC_time_c lh_end_time; + lbRTC_time_c lh_max_time; + lbRTC_ymd_c* renew_time = &Save_Get(LightHouse).renew_time; + int equal; + + if (Save_Get(LightHouse).renew_time.day == 0) { + return mSC_LIGHTHOUSE_PERIOD_NONE; + } + + mTM_ymd_2_time(&lh_start_time, renew_time); + lbRTC_TimeCopy(&lh_end_time, &lh_start_time); + lbRTC_Add_DD(&lh_end_time, lbRTC_WEEK); + lbRTC_TimeCopy(&lh_max_time, &lh_start_time); + lbRTC_Add_DD(&lh_max_time, mSC_LIGHTHOUSE_DAYS); + + equal = lbRTC_IsEqualDate(lh_start_time.year, lh_start_time.month, lh_start_time.day, time->year, time->month, + time->day); + + if (equal == lbRTC_OVER) { + return mSC_LIGHTHOUSE_PERIOD_NONE; // start date is after the current date (time travelled backwards) + } + + if (equal == lbRTC_EQUAL) { + return mSC_LIGHTHOUSE_PERIOD_0; // start date is current date + } + + if (lbRTC_IsEqualDate(lh_end_time.year, lh_end_time.month, lh_end_time.day, time->year, time->month, time->day) != + lbRTC_LESS) { + return mSC_LIGHTHOUSE_PERIOD_1; + } else if (lbRTC_IsEqualDate(lh_max_time.year, lh_max_time.month, lh_max_time.day, time->year, time->month, + time->day) != lbRTC_LESS) { + return mSC_LIGHTHOUSE_PERIOD_2; + } - if (Save_Get(LightHouse).renew_time.day == 0) { return mSC_LIGHTHOUSE_PERIOD_NONE; - } - - mTM_ymd_2_time(&lh_start_time, renew_time); - lbRTC_TimeCopy(&lh_end_time, &lh_start_time); - lbRTC_Add_DD(&lh_end_time, lbRTC_WEEK); - lbRTC_TimeCopy(&lh_max_time, &lh_start_time); - lbRTC_Add_DD(&lh_max_time, mSC_LIGHTHOUSE_DAYS); - - equal = lbRTC_IsEqualDate( - lh_start_time.year, lh_start_time.month, lh_start_time.day, - time->year, time->month, time->day - ); - - if (equal == lbRTC_OVER) { - return mSC_LIGHTHOUSE_PERIOD_NONE; // start date is after the current date (time travelled backwards) - } - - if (equal == lbRTC_EQUAL) { - return mSC_LIGHTHOUSE_PERIOD_0; // start date is current date - } - - if ( - lbRTC_IsEqualDate( - lh_end_time.year, lh_end_time.month, lh_end_time.day, - time->year, time->month, time->day - ) != lbRTC_LESS - ) { - return mSC_LIGHTHOUSE_PERIOD_1; - } - else if (lbRTC_IsEqualDate( - lh_max_time.year, lh_max_time.month, lh_max_time.day, - time->year, time->month, time->day - ) != lbRTC_LESS - ) { - return mSC_LIGHTHOUSE_PERIOD_2; - } - - return mSC_LIGHTHOUSE_PERIOD_NONE; } extern int mSC_LightHouse_day(const lbRTC_time_c* time) { - lbRTC_time_c lh_start_time; - int days; - lbRTC_ymd_c* renew_time = &Save_Get(LightHouse).renew_time; + lbRTC_time_c lh_start_time; + int days; + lbRTC_ymd_c* renew_time = &Save_Get(LightHouse).renew_time; - if (Save_Get(LightHouse).renew_time.day == 0) { - return 0; - } + if (Save_Get(LightHouse).renew_time.day == 0) { + return 0; + } - mTM_ymd_2_time(&lh_start_time, renew_time); + mTM_ymd_2_time(&lh_start_time, renew_time); - if (lbRTC_IsOverTime(&lh_start_time, time) == lbRTC_LESS) { - return 0; - } + if (lbRTC_IsOverTime(&lh_start_time, time) == lbRTC_LESS) { + return 0; + } - days = lbRTC_GetIntervalDays(&lh_start_time, time) - 1; + days = lbRTC_GetIntervalDays(&lh_start_time, time) - 1; - if (days < 0) { - return 0; - } + if (days < 0) { + return 0; + } - return days <= (lbRTC_WEEK - 1) ? days : (lbRTC_WEEK - 1); + return days <= (lbRTC_WEEK - 1) ? days : (lbRTC_WEEK - 1); } extern int mSC_LightHouse_Event_Check(int player_no) { - LightHouse_c* lh = Save_GetPointer(LightHouse); + LightHouse_c* lh = Save_GetPointer(LightHouse); - if (player_no == -1) { - player_no = Common_Get(player_no); - } - - if (player_no >= mPr_FOREIGNER) { - return 0; - } - - if (mSC_LightHouse_get_period(Common_GetPointer(time.rtc_time)) != mSC_LIGHTHOUSE_PERIOD_2) { - return 0; - } - - if ((lh->players_completed & (1 << player_no)) != 0) { - return 0; - } - - if ((lh->days_switched_on & 0x7F) == 0x7F) { - if ((lh->players_quest_started & (u8)(1 << (player_no + 4))) != 0) { - if (lh->renew_time.month == lbRTC_JANUARY) { - return 1; - } - else { - return 3; - } + if (player_no == -1) { + player_no = Common_Get(player_no); } - } - else if ((lh->players_quest_started & (u8)(1 << Common_Get(player_no))) != 0) { - if (lh->renew_time.month == lbRTC_JANUARY) { - return 2; - } - else { - return 4; - } - } - return 0; + if (player_no >= mPr_FOREIGNER) { + return 0; + } + + if (mSC_LightHouse_get_period(Common_GetPointer(time.rtc_time)) != mSC_LIGHTHOUSE_PERIOD_2) { + return 0; + } + + if ((lh->players_completed & (1 << player_no)) != 0) { + return 0; + } + + if ((lh->days_switched_on & 0x7F) == 0x7F) { + if ((lh->players_quest_started & (u8)(1 << (player_no + 4))) != 0) { + if (lh->renew_time.month == lbRTC_JANUARY) { + return 1; + } else { + return 3; + } + } + } else if ((lh->players_quest_started & (u8)(1 << Common_Get(player_no))) != 0) { + if (lh->renew_time.month == lbRTC_JANUARY) { + return 2; + } else { + return 4; + } + } + + return 0; } extern void mSC_LightHouse_Event_Clear(int player_no) { - LightHouse_c* lh = Save_GetPointer(LightHouse); + LightHouse_c* lh = Save_GetPointer(LightHouse); - if (player_no == -1) { - player_no = Common_Get(player_no); - } - - if (player_no < mPr_FOREIGNER) { - int check; - - lh->players_completed |= (1 << player_no); - check = mSC_LightHouse_Event_Check(player_no); - - if (check == 2 || check == 4) { - lh->players_completed |= 0b1111; + if (player_no == -1) { + player_no = Common_Get(player_no); + } + + if (player_no < mPr_FOREIGNER) { + int check; + + lh->players_completed |= (1 << player_no); + check = mSC_LightHouse_Event_Check(player_no); + + if (check == 2 || check == 4) { + lh->players_completed |= 0b1111; + } } - } } extern mActor_name_t mSC_LightHouse_Event_Present_Item() { - if (Save_Get(LightHouse).renew_time.month == lbRTC_JANUARY) { - return FTR_LIGHTHOUSE_MODEL; - } + if (Save_Get(LightHouse).renew_time.month == lbRTC_JANUARY) { + return FTR_LIGHTHOUSE_MODEL; + } - return FTR_CHOCOLATES; + return FTR_CHOCOLATES; } static void mSC_LightHouse_clear_data() { - mem_clear((u8*)Save_GetPointer(LightHouse), sizeof(LightHouse_c), 0); + mem_clear((u8*)Save_GetPointer(LightHouse), sizeof(LightHouse_c), 0); } extern int mSC_LightHouse_Event_Start() { - LightHouse_c* lh = Save_GetPointer(LightHouse); - lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + LightHouse_c* lh = Save_GetPointer(LightHouse); + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - if (lh->renew_time.day == 0) { + if (lh->renew_time.day == 0) { + return TRUE; + } + + if (mSC_LightHouse_get_period(rtc_time) != mSC_LIGHTHOUSE_PERIOD_NONE) { + return FALSE; + } + + mSC_LightHouse_clear_data(); return TRUE; - } - - if (mSC_LightHouse_get_period(rtc_time) != mSC_LIGHTHOUSE_PERIOD_NONE) { - return FALSE; - } - - mSC_LightHouse_clear_data(); - return TRUE; } extern int mSC_LightHouse_Talk_After_Check() { - LightHouse_c* lh = Save_GetPointer(LightHouse); - lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + LightHouse_c* lh = Save_GetPointer(LightHouse); + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - if (mSC_LightHouse_get_period(rtc_time) == mSC_LIGHTHOUSE_PERIOD_NONE) { - return FALSE; - } + if (mSC_LightHouse_get_period(rtc_time) == mSC_LIGHTHOUSE_PERIOD_NONE) { + return FALSE; + } - return (lh->players_quest_started & 0b1111) != 0; + return (lh->players_quest_started & 0b1111) != 0; } extern void mSC_LightHouse_Quest_Start() { - LightHouse_c* lh = Save_GetPointer(LightHouse); - lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + LightHouse_c* lh = Save_GetPointer(LightHouse); + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - mSC_LightHouse_clear_data(); - mTM_set_renew_time(&lh->renew_time, rtc_time); - lh->players_quest_started |= (u8)(1 << Common_Get(player_no)); + mSC_LightHouse_clear_data(); + mTM_set_renew_time(&lh->renew_time, rtc_time); + lh->players_quest_started |= (u8)(1 << Common_Get(player_no)); } extern int mSC_LightHouse_Switch_Check() { - lbRTC_time_c adjusted_rtc_time; - LightHouse_c* lh = Save_GetPointer(LightHouse); - lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - int day; - - lbRTC_TimeCopy(&adjusted_rtc_time, rtc_time); - lbRTC_Sub_hh(&adjusted_rtc_time, 6); + lbRTC_time_c adjusted_rtc_time; + LightHouse_c* lh = Save_GetPointer(LightHouse); + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + int day; - if (lh->renew_time.day == 0) { - return TRUE; - } + lbRTC_TimeCopy(&adjusted_rtc_time, rtc_time); + lbRTC_Sub_hh(&adjusted_rtc_time, 6); - if (mSC_LightHouse_get_period(&adjusted_rtc_time) != mSC_LIGHTHOUSE_PERIOD_1) { - return TRUE; - } + if (lh->renew_time.day == 0) { + return TRUE; + } - day = mSC_LightHouse_day(&adjusted_rtc_time); - return (lh->days_switched_on & (1 << day)) != 0; + if (mSC_LightHouse_get_period(&adjusted_rtc_time) != mSC_LIGHTHOUSE_PERIOD_1) { + return TRUE; + } + + day = mSC_LightHouse_day(&adjusted_rtc_time); + return (lh->days_switched_on & (1 << day)) != 0; } extern int mSC_LightHouse_In_Check() { - lbRTC_time_c time; - LightHouse_c* lh = Save_GetPointer(LightHouse); - lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - int day; + lbRTC_time_c time; + LightHouse_c* lh = Save_GetPointer(LightHouse); + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + int day; - if (Common_Get(player_no) >= mPr_FOREIGNER) { - return FALSE; - } + if (Common_Get(player_no) >= mPr_FOREIGNER) { + return FALSE; + } - if (mEv_CheckFirstJob() != FALSE) { - return FALSE; - } + if (mEv_CheckFirstJob() != FALSE) { + return FALSE; + } - lbRTC_TimeCopy(&time, rtc_time); - - if (lh->renew_time.day == 0) { - return FALSE; - } + lbRTC_TimeCopy(&time, rtc_time); - if (mSC_LightHouse_get_period(&time) != mSC_LIGHTHOUSE_PERIOD_1) { - return FALSE; - } + if (lh->renew_time.day == 0) { + return FALSE; + } - if (time.hour < 18 || time.hour >= 22) { - return FALSE; - } + if (mSC_LightHouse_get_period(&time) != mSC_LIGHTHOUSE_PERIOD_1) { + return FALSE; + } - day = mSC_LightHouse_day(&time); - return (lh->days_switched_on & (1 << day)) == 0; + if (time.hour < 18 || time.hour >= 22) { + return FALSE; + } + + day = mSC_LightHouse_day(&time); + return (lh->days_switched_on & (1 << day)) == 0; } extern void mSC_LightHouse_Switch_On() { - LightHouse_c* lh = Save_GetPointer(LightHouse); - lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); - int day; - int player_no; + LightHouse_c* lh = Save_GetPointer(LightHouse); + lbRTC_time_c* rtc_time = Common_GetPointer(time.rtc_time); + int day; + int player_no; - day = mSC_LightHouse_day(rtc_time); - lh->days_switched_on |= (1 << day); - player_no = Common_Get(player_no); - - if (player_no < mPr_FOREIGNER) { - lh->players_quest_started |= (u8)(1 << (player_no + 4)); - } + day = mSC_LightHouse_day(rtc_time); + lh->days_switched_on |= (1 << day); + player_no = Common_Get(player_no); + + if (player_no < mPr_FOREIGNER) { + lh->players_quest_started |= (u8)(1 << (player_no + 4)); + } } extern void mSC_LightHouse_Delete_Player(int player_no) { - Save_Get(LightHouse).players_quest_started &= ~(u8)(1 << (player_no + 4)); + Save_Get(LightHouse).players_quest_started &= ~(u8)(1 << (player_no + 4)); } extern int mSC_LightHouse_travel_check() { - switch (mSC_LightHouse_get_period(Common_GetPointer(time.rtc_time))) { - case mSC_LIGHTHOUSE_PERIOD_1: - return TRUE; - default: - return FALSE; - } + switch (mSC_LightHouse_get_period(Common_GetPointer(time.rtc_time))) { + case mSC_LIGHTHOUSE_PERIOD_1: + return TRUE; + default: + return FALSE; + } } extern void mSC_change_player_freeze(GAME_PLAY* play) { - if (mPlib_get_player_actor_main_index((GAME*)play) != 74) { - mPlib_request_main_demo_wait_type1(play, 0, NULL); - } + if (mPlib_get_player_actor_main_index((GAME*)play) != 74) { + mPlib_request_main_demo_wait_type1((GAME*)play, 0, NULL); + } } extern u32 mSC_check_ArbeitPlayer() { - return mSC_trophy_get(32); + return mSC_trophy_get(32); }