From 5083c7f2baaeb7574bd5fb49534e6668d73fd430 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Mon, 25 Mar 2024 00:06:16 -0400 Subject: [PATCH] Match ac_my_room.c --- include/ac_furniture.h | 44 +- include/ac_my_room.h | 44 +- include/audio.h | 4 +- include/jaudio_NES/rhythm.h | 5 +- include/m_common_data.h | 2 +- include/m_home_h.h | 208 +-- include/m_name_table.h | 2 +- src/ac_furniture_data.c_inc | 2603 +++++++++++++++++++++++++++++++++++ src/ac_my_room.c | 2274 ++++++++++++++++++++++++++++++ src/ac_my_room_data.c_inc | 1402 +++++++++++++++++++ src/audio.c | 9 +- src/famicom_emu.c | 6 +- src/ftr/ac_ike_jny_houi01.c | 41 +- src/m_island.c | 1058 +++++++------- src/m_room_type.c | 8 +- tools/arc_tool.py | 17 +- 16 files changed, 6995 insertions(+), 732 deletions(-) create mode 100644 src/ac_furniture_data.c_inc create mode 100644 src/ac_my_room.c create mode 100644 src/ac_my_room_data.c_inc diff --git a/include/ac_furniture.h b/include/ac_furniture.h index 98f64f54..0ffbc750 100644 --- a/include/ac_furniture.h +++ b/include/ac_furniture.h @@ -12,6 +12,9 @@ extern "C" { typedef struct furniture_actor_s FTR_ACTOR; +#define aFTR_KEEP_ITEM_COUNT (mCoBG_LAYER_NUM - 1) +#define aFTR_CHECK_INTERACTION(inter, type) (((inter) >> (type)) & 1) + enum { aFTR_STATE_STOP, aFTR_STATE_WAIT_PUSH, @@ -62,7 +65,7 @@ enum { enum { aFTR_INTERACTION_STORAGE_DRAWERS = 1, // dressers - aFTR_INTERACTION_STORAGE_WARDROBE, // double doors + aFTR_INTERACTION_STORAGE_WARDROBE = 2, // double doors aFTR_INTERACTION_STORAGE_CLOSET = 4, // single door aFTR_INTERACTION_MUSIC_DISK = 8, aFTR_INTERACTION_NO_COLLISION = 0x10, @@ -78,19 +81,52 @@ enum { aFTR_INTERACTION_FAMICOM_ITEM = 0x2000, aFTR_INTERACTION_RADIO_AEROBICS = 0x4000, aFTR_INTERACTION_TOGGLE = 0x8000, - aFTR_INTERACTION_NUM = 15, }; +enum { + aFTR_INTERACTION_TYPE_DRAWERS, + aFTR_INTERACTION_TYPE_WARDROBE, + aFTR_INTERACTION_TYPE_CLOSET, + aFTR_INTERACTION_TYPE_MUSIC_DISK, + aFTR_INTERACTION_TYPE_NO_COLLISION, + aFTR_INTERACTION_TYPE_HANIWA, + aFTR_INTERACTION_TYPE_FISH, + aFTR_INTERACTION_TYPE_INSECT, + aFTR_INTERACTION_TYPE_MANNEKIN, + aFTR_INTERACTION_TYPE_UMBRELLA, + aFTR_INTERACTION_TYPE_FOSSIL, + aFTR_INTERACTION_TYPE_FAMICOM, + aFTR_INTERACTION_TYPE_START_DISABLED, + aFTR_INTERACTION_TYPE_FAMICOM_ITEM, + aFTR_INTERACTION_TYPE_RADIO_AEROBICS, + aFTR_INTERACTION_TYPE_TOGGLE, + + aFTR_INTERACTION_NUM, +}; + +#define aFTR_IS_STORAGE(profile) \ + (aFTR_CHECK_INTERACTION((profile)->interaction_type, aFTR_INTERACTION_TYPE_DRAWERS) || \ + aFTR_CHECK_INTERACTION((profile)->interaction_type, aFTR_INTERACTION_TYPE_WARDROBE) || \ + aFTR_CHECK_INTERACTION((profile)->interaction_type, aFTR_INTERACTION_TYPE_CLOSET) || \ + aFTR_CHECK_INTERACTION((profile)->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK)) enum { aFTR_CONTACT_ACTION_CHAIR_UNIDIRECTIONAL = 1, // only can sit from the front aFTR_CONTACT_ACTION_CHAIR_MULTIDIRECTIONAL = 2, // can sit from any direction aFTR_CONTACT_ACTION_CHAIR_SOFA = 4, // cam sit anywhere from the front aFTR_CONTACT_ACTION_BED_SINGLE = 8, // single bed (can't roll) - aFTR_CONTACT_ACTION_BED_DOUBLE = 0x10, // double bed (can roll) + aFTR_CONTACT_ACTION_BED_DOUBLE = 0x10, // double bed (can roll) aFTR_CONTACT_ACTION_NUM }; +enum { + aFTR_SET_TYPE_NORMAL, /* Can't be placed on top and is not a table (layer0) */ + aFTR_SET_TYPE_SURFACE, /* Is a surface (layer0) */ + aFTR_SET_TYPE_ON_SURFACE, /* Can be placed on a surface (layer0/layer1) */ + + aFTR_SET_TYPE_NUM +}; + typedef void (*aFTR_FTR_CT_PROC)(FTR_ACTOR*, u8*); typedef void (*aFTR_FTR_MOVE_PROC)(FTR_ACTOR*, ACTOR*, GAME*, u8*); typedef void (*aFTR_FTR_DRAW_PROC)(FTR_ACTOR*, ACTOR*, GAME*, u8*); @@ -186,7 +222,7 @@ struct furniture_actor_s { s16 _83E; s16 open_music_disk; /* set when a music player is interacted with */ s16 dust_timer; - mActor_name_t items[mCoBG_LAYER_NUM - 1]; /* used for holding items (music players & wardrobes) */ + mActor_name_t items[aFTR_KEEP_ITEM_COUNT]; /* used for holding items (music players & wardrobes) */ int _84C; u16* pal_p; /* used for furniture actors with dynamic palettes such as the structure model items */ int _854; diff --git a/include/ac_my_room.h b/include/ac_my_room.h index 9cfddf77..dfae0a25 100644 --- a/include/ac_my_room.h +++ b/include/ac_my_room.h @@ -10,6 +10,9 @@ extern "C" { #endif +#define aMR_MAX_UNIT 8 +#define aMR_HANIWA_ON_TABLE_NUM 14 + typedef struct my_room_actor_s MY_ROOM_ACTOR; enum { @@ -29,6 +32,23 @@ enum { aMR_CONTACT_DIR_NUM }; +enum { + aMR_FRIEND_ALL, + aMR_FRIEND_ON, + aMR_FRIEND_OFF, + + aMR_FRIEND_NUM +}; + +enum { + aMR_DIRECT_UP, + aMR_DIRECT_LEFT, + aMR_DIRECT_DOWN, + aMR_DIRECT_RIGHT, + + aMR_DIRECT_NUM +}; + typedef struct my_room_contact_s { int contact_flag; int ftr_no; @@ -48,18 +68,18 @@ typedef struct my_room_clock_info_s { int frame; /* 0-119 */ } aMR_clock_info_c; -typedef int (*aMR_JUDGE_BREED_NEW_FTR_PROC)(GAME_PLAY* play, u16 ftr_no, int* ut_x, int* ut_z, u16* rotation, +typedef int (*aMR_JUDGE_BREED_NEW_FTR_PROC)(GAME* game, u16 ftr_no, int* ut_x, int* ut_z, u16* rotation, int* square_offset, int* layer); -typedef mActor_name_t (*aMR_SEARCH_PICKUP_FURNITURE_PROC)(GAME_PLAY* play); -typedef void (*aMR_FURNITURE2ITEMBAG_PROC)(GAME_PLAY* play); +typedef mActor_name_t (*aMR_SEARCH_PICKUP_FURNITURE_PROC)(GAME* game); +typedef void (*aMR_FURNITURE2ITEMBAG_PROC)(GAME* game); typedef int (*aMR_JUDGE_PLAYER_ACTION_PROC)(xyz_t* wpos0, xyz_t* wpos1, int ftr_actor_idx); typedef void (*aMR_PLAYER_MOVE_FURNITURE_PROC)(int ftr_actor_idx, xyz_t* wpos); typedef int (*aMR_FTR_ID_2_WPOS_PROC)(xyz_t* wpos, int ftr_id); typedef int (*aMR_UNIT_NUM_2_FTR_ITEMNO_FTRID_PROC)(mActor_name_t* ftr_item_no, int* ftr_id, int ut_x, int ut_z, - s16 layer); + int layer); typedef void (*aMR_FTR_ID_2_EXTINGUISH_FURNITURE_PROC)(int ftr_id); -typedef void (*aMR_REDMA_FTR_BANK_PROC)(); -typedef int (*aMR_RESERVE_FURNITURE_PROC)(GAME_PLAY* play, u16 ftr_no, int judge_res, int ut_x, int ut_z, u16 rotation, +typedef void (*aMR_REDMA_FTR_BANK_PROC)(void); +typedef int (*aMR_RESERVE_FURNITURE_PROC)(GAME* game, u16 ftr_no, int judge_res, int ut_x, int ut_z, u16 rotation, int square_offset, int layer); typedef int (*aMR_COUNT_FRIEND_FURNITURE_PROC)(FTR_ACTOR* ftr_actor, u8 switch_on); typedef int (*aMR_JUDGE_PLACE_2ND_LAYER_PROC)(int ut_x, int ut_z); @@ -75,13 +95,13 @@ typedef int (*aMR_PICKUP_FTR_LAYER_PROC)(void); typedef void (*aMR_LEAF_PICKUPED_PROC)(void); typedef void (*aMR_FAMICOM_EMU_COMMON_MOVE_PROC)(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, GAME* game, int rom_no, int agb_rom_no); -typedef u32 (*aMR_FTR_NO_2_BANK_ADDRESS_PROC)(u16 ftr_no); +typedef u8* (*aMR_FTR_NO_2_BANK_ADDRESS_PROC)(u16 ftr_no); typedef void (*aMR_CALL_SIT_DOWN_ONGEN_POS_SE_PROC)(const xyz_t* pos); typedef void (*aMR_SOUND_MELODY_PROC)(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, int idx); typedef int (*aMR_CHECK_DANNA_KILL_PROC)(xyz_t* pos); typedef struct my_room_clip_s { - MY_ROOM_ACTOR* my_room_actor_p; + ACTOR* my_room_actor_p; aMR_JUDGE_BREED_NEW_FTR_PROC judge_breed_new_ftr_proc; aMR_SEARCH_PICKUP_FURNITURE_PROC search_pickup_ftr_proc; aMR_FURNITURE2ITEMBAG_PROC ftr2itemBag_proc; @@ -162,7 +182,7 @@ typedef struct emu_info_s { int _10; int card_famicom_count; int memory_game_select; - char** famicom_names_p; + char* famicom_names_p; s16 save_msg_timer; s16 external_rom; } aMR_emu_info_c; @@ -215,7 +235,7 @@ struct my_room_actor_s { s16 keep_pull_flag; xyz_t pull_target_pos0; xyz_t pull_target_pos1; - int haniwa_on_table[14]; + int haniwa_on_table[aMR_HANIWA_ON_TABLE_NUM]; aMR_bgm_info_c bgm_info; aMR_room_info_c room_info; aMR_emu_info_c emu_info; @@ -257,8 +277,8 @@ extern int aMR_GetFurnitureUnit(mActor_name_t ftr); extern mActor_name_t aMR_FurnitureFg_to_FurnitureFgWithDirect(mActor_name_t ftr, int direct); extern void aMR_SameFurnitureSwitchOFF(u16 ftr_name); extern aMR_contact_info_c* aMR_GetContactInfoLayer1(void); -extern FTR_ACTOR* aMR_GetParentFactor(); -extern s16 aMR_GetParentAngleOffset(FTR_ACTOR* ftr_actor, MY_ROOM_ACTOR* my_room_actor); +extern FTR_ACTOR* aMR_GetParentFactor(FTR_ACTOR* ftr_actor, ACTOR* my_room_actorx); +extern s16 aMR_GetParentAngleOffset(FTR_ACTOR* ftr_actor, ACTOR* my_room_actorx); extern void aMR_SetSurprise(ACTOR* my_room_actor, s16 rot); extern void aMR_RadioCommonMove(FTR_ACTOR* ftr_actor, ACTOR* my_room_actorx); diff --git a/include/audio.h b/include/audio.h index 34f49505..7236a34d 100644 --- a/include/audio.h +++ b/include/audio.h @@ -69,8 +69,8 @@ extern void sAdo_Pause(u8 mode); extern f32 sAdo_GetRhythmAnimCounter(u32 id); extern s8 sAdo_GetRhythmDelay(u32 id); -extern f32 sAdo_GetRhythmInfo(u32 id); -extern void sAdo_SetRhythmInfo(f32 p); +extern void sAdo_GetRhythmInfo(TempoBeat_c* rhythm); +extern void sAdo_SetRhythmInfo(TempoBeat_c* rhythm); extern int sAdo_InstCountGet(); diff --git a/include/jaudio_NES/rhythm.h b/include/jaudio_NES/rhythm.h index e22dec33..44becac8 100644 --- a/include/jaudio_NES/rhythm.h +++ b/include/jaudio_NES/rhythm.h @@ -2,6 +2,7 @@ #define RHYTHM_H #include "types.h" +#include "audio.h" #ifdef __cplusplus extern "C" { @@ -12,8 +13,8 @@ extern void Na_RhythmStop(u32); extern void Na_RhythmAllStop(); extern f32 Na_GetRhythmAnimCounter(u32); extern s8 Na_GetRhythmDelay(u32); -extern f32 Na_GetRhythmInfo(u32); -extern void Na_SetRhythmInfo(f32); +extern void Na_GetRhythmInfo(TempoBeat_c* rhythm); +extern void Na_SetRhythmInfo(TempoBeat_c* rhythm); #ifdef __cplusplus } diff --git a/include/m_common_data.h b/include/m_common_data.h index 589853d4..056c7562 100644 --- a/include/m_common_data.h +++ b/include/m_common_data.h @@ -310,7 +310,7 @@ typedef struct common_data_s { /* 0x02DBA4 */ s16 island_weather_intensity; /* 0x02DBA6 */ s16 _2DBA6; /* 0x02DBA8 */ u8 memcard_slot; - /* 0X02DBAC */ int famicom_2DBAC; + /* 0X02DBAC */ int my_room_message_control_flags; /* 0x02DBB0 */ s16 can_look_goki_count; /* 0x02DBB4 */ f32 rainbow_opacity; /* current opacity of rainbow (0.0f - 1.0f) */ /* 0x02DBB8 */ u32 event_flags[mEv_EVENT_TYPE_NUM]; diff --git a/include/m_home_h.h b/include/m_home_h.h index f59ef86f..4486ec0f 100644 --- a/include/m_home_h.h +++ b/include/m_home_h.h @@ -19,169 +19,171 @@ extern "C" { #define mHm_LAYER_NUM 4 enum { - mHm_ROOM_MAIN, - mHm_ROOM_UPPER, - mHm_ROOM_BASEMENT, + mHm_ROOM_MAIN, + mHm_ROOM_UPPER, + mHm_ROOM_BASEMENT, - mHm_ROOM_NUM + mHm_ROOM_NUM }; enum { - mHm_ROOMTYPE_SMALL, - mHm_ROOMTYPE_MEDIUM, - mHm_ROOMTYPE_LARGE, - mHm_ROOMTYPE_COTTAGE, + mHm_ROOMTYPE_SMALL, + mHm_ROOMTYPE_MEDIUM, + mHm_ROOMTYPE_LARGE, + mHm_ROOMTYPE_COTTAGE, - mHm_ROOMTYPE_NUM + mHm_ROOMTYPE_NUM }; enum { - mHm_HOMESIZE_SMALL, /* initial size */ - mHm_HOMESIZE_MEDIUM, /* paid off first debt */ - mHm_HOMESIZE_LARGE, /* paid off second debt (excluding basement) */ - mHm_HOMESIZE_UPPER, /* paid off third debt & basement */ - mHm_HOMESIZE_STATUE, /* paid off final debt */ + mHm_HOMESIZE_SMALL, /* initial size */ + mHm_HOMESIZE_MEDIUM, /* paid off first debt */ + mHm_HOMESIZE_LARGE, /* paid off second debt (excluding basement) */ + mHm_HOMESIZE_UPPER, /* paid off third debt & basement */ + mHm_HOMESIZE_STATUE, /* paid off final debt */ - mHm_HOMESIZE_NUM + mHm_HOMESIZE_NUM }; enum { - mHm_HANIWA_TRADE_0, - mHm_HANIWA_TRADE_1, - mHm_HANIWA_TRADE_2, - mHm_HANIWA_TRADE_3, - - mHm_HANIWA_TRADE_NUM + mHm_HANIWA_TRADE_0, + mHm_HANIWA_TRADE_1, + mHm_HANIWA_TRADE_2, + mHm_HANIWA_TRADE_3, + + mHm_HANIWA_TRADE_NUM }; enum { - mHm_OUTLOOK_PAL_0, - mHm_OUTLOOK_PAL_1, - mHm_OUTLOOK_PAL_2, - mHm_OUTLOOK_PAL_3, - mHm_OUTLOOK_PAL_4, - mHm_OUTLOOK_PAL_5, - mHm_OUTLOOK_PAL_6, - mHm_OUTLOOK_PAL_7, - mHm_OUTLOOK_PAL_8, - mHm_OUTLOOK_PAL_9, - mHm_OUTLOOK_PAL_10, - mHm_OUTLOOK_PAL_11, + mHm_OUTLOOK_PAL_0, + mHm_OUTLOOK_PAL_1, + mHm_OUTLOOK_PAL_2, + mHm_OUTLOOK_PAL_3, + mHm_OUTLOOK_PAL_4, + mHm_OUTLOOK_PAL_5, + mHm_OUTLOOK_PAL_6, + mHm_OUTLOOK_PAL_7, + mHm_OUTLOOK_PAL_8, + mHm_OUTLOOK_PAL_9, + mHm_OUTLOOK_PAL_10, + mHm_OUTLOOK_PAL_11, - mHm_OUTLOOK_PAL_NUM + mHm_OUTLOOK_PAL_NUM }; /* sizeof(mHm_rmsz_c) == 6 */ typedef struct home_size_info_s { - /* 0x00 */ struct { - /* 0x00 */ u8 day; - /* 0x01 */ u8 month; - /* 0x02 */ u16 year; - } upgrade_order_date; /* date you ordered an upgrade, seems to be a struct */ + /* 0x00 */ struct { + /* 0x00 */ u8 day; + /* 0x01 */ u8 month; + /* 0x02 */ u16 year; + } upgrade_order_date; /* date you ordered an upgrade, seems to be a struct */ - /* 0x04 */ u8 size:3; /* current house size */ - /* 0x04 */ u8 next_size:3; /* next house size when upgrade is ordered */ - /* 0x04 */ u8 statue_rank:2; /* statue ranking, 0 = gold, 1 = silver, 2 = bronze, 3 = jade */ - /* 0x05 */ u8 renew:1; /* refresh house size & 'outlook' palette */ - /* 0x05 */ u8 statue_ordered:1; /* set when statue is ordered from Nook */ - /* 0x05 */ u8 basement_ordered:1; /* set when basement has been ordered */ - /* 0x05 */ u8 pad:5; /* unused? */ + /* 0x04 */ u8 size : 3; /* current house size */ + /* 0x04 */ u8 next_size : 3; /* next house size when upgrade is ordered */ + /* 0x04 */ u8 statue_rank : 2; /* statue ranking, 0 = gold, 1 = silver, 2 = bronze, 3 = jade */ + /* 0x05 */ u8 renew : 1; /* refresh house size & 'outlook' palette */ + /* 0x05 */ u8 statue_ordered : 1; /* set when statue is ordered from Nook */ + /* 0x05 */ u8 basement_ordered : 1; /* set when basement has been ordered */ + /* 0x05 */ u8 pad : 5; /* unused? */ } mHm_rmsz_c; /* sizeof(Haniwa_Item_c) == 8 */ typedef struct home_haniwa_item_s { - /* 0x00 */ mActor_name_t item; /* held item */ - /* 0x02 */ s16 exchange_type; /* type of exchange (sale, free, trade) */ - /* 0x04 */ u32 extra_data; /* trade related data */ + /* 0x00 */ mActor_name_t item; /* held item */ + /* 0x02 */ s16 exchange_type; /* type of exchange (sale, free, trade) */ + /* 0x04 */ u32 extra_data; /* trade related data */ } Haniwa_Item_c; /* sizeof(Haniwa_c) == 0xA4 */ typedef struct home_haniwa_s { - /* 0x00 */ Haniwa_Item_c items[HANIWA_ITEM_HOLD_NUM]; /* held items */ - /* 0x20 */ u8 message[HANIWA_MESSAGE_LEN]; /* message for visitors */ - /* 0xA0 */ u32 bells; /* held bells from selling items */ + /* 0x00 */ Haniwa_Item_c items[HANIWA_ITEM_HOLD_NUM]; /* held items */ + /* 0x20 */ u8 message[HANIWA_MESSAGE_LEN]; /* message for visitors */ + /* 0xA0 */ u32 bells; /* held bells from selling items */ } Haniwa_c; /* sizeof(mHm_wf_c) == 2 */ typedef struct home_wall_floor_s { - /* 0x00 */ u8 flooring_idx; - /* 0x01 */ u8 wallpaper_idx; + /* 0x00 */ u8 flooring_idx; + /* 0x01 */ u8 wallpaper_idx; } mHm_wf_c; /* sizeof(mHm_goki_c) == 0xA */ typedef struct home_goki_s { - /* 0x00 */ lbRTC_time_c time; /* last time updated */ - /* 0x08 */ u8 num; /* number of cockroaches in the house */ - /* 0x09 */ u8 pad; /* unused outside of being initalized to 0 */ + /* 0x00 */ lbRTC_time_c time; /* last time updated */ + /* 0x08 */ u8 num; /* number of cockroaches in the house */ + /* 0x09 */ u8 pad; /* unused outside of being initalized to 0 */ } mHm_goki_c; /* sizeof(mHm_lyr_c) == 0x228 */ typedef struct home_layer_s { - /* 0x000 */ mActor_name_t items[UT_Z_NUM][UT_X_NUM]; /* Furniture item actors */ - /* 0x200 */ u64 ftr_switch; /* Bitfield for controlling which furniture items are active, max of 64 */ - /* 0x208 */ u32 unk_208[8]; /* Only referenced in mISL_gc_to_agb_layer */ + /* 0x000 */ mActor_name_t items[UT_Z_NUM][UT_X_NUM]; /* Furniture item actors */ + /* 0x200 */ u64 ftr_switch; /* Bitfield for controlling which furniture items are active, max of 64 */ + /* 0x208 */ u32 haniwa_step[8]; /* Only referenced in mISL_gc_to_agb_layer */ } mHm_lyr_c; typedef struct floor_bit_info_s { - u8 wall_original:1; /* is wallpaper a pattern (original)? */ - u8 floor_original:1; /* is flooring a pattern (original)? */ - u8 bit_2_7:6; /* unused? */ + u8 wall_original : 1; /* is wallpaper a pattern (original)? */ + u8 floor_original : 1; /* is flooring a pattern (original)? */ + u8 bit_2_7 : 6; /* unused? */ } mHm_fllot_bit_c; /* sizeof(mHm_flr_c) == 0x8A8 */ typedef struct home_floor_s { - /* 0x000 */ mHm_lyr_c layer_main; - /* 0x228 */ mHm_lyr_c layer_secondary; /* Also storage layer 0 */ - /* 0x450 */ mHm_lyr_c layer_storage1; - /* 0x678 */ mHm_lyr_c layer_storage2; - /* 0x8A0 */ mHm_wf_c wall_floor; - /* 0x8A2 */ TempoBeat_c tempo_beat; - /* 0x8A4 */ mHm_fllot_bit_c floor_bit_info; + /* 0x000 */ mHm_lyr_c layer_main; + /* 0x228 */ mHm_lyr_c layer_secondary; /* Also storage layer 0 */ + /* 0x450 */ mHm_lyr_c layer_storage1; + /* 0x678 */ mHm_lyr_c layer_storage2; + /* 0x8A0 */ mHm_wf_c wall_floor; + /* 0x8A2 */ TempoBeat_c tempo_beat; + /* 0x8A4 */ mHm_fllot_bit_c floor_bit_info; } mHm_flr_c; /* sizeof(mHm_flg_c) == 1 */ typedef struct home_flags_s { - u8 house_updated:1; /* signals HRA to re-score house */ - u8 has_saved:1; /* whether or not the player has saved at this house before */ - u8 hra_member:1; /* whether or not the house has been setup for HRA membership */ - u8 has_basement:1; /* set when the basement is built */ - u8 hra_reward0:1; /* earned 70k HRA points reward */ - u8 hra_reward1:1; /* earned 100k HRA points reward */ - u8 bit_6:1; /* unused */ - u8 bit_7:1; /* unused */ + u8 house_updated : 1; /* signals HRA to re-score house */ + u8 has_saved : 1; /* whether or not the player has saved at this house before */ + u8 hra_member : 1; /* whether or not the house has been setup for HRA membership */ + u8 has_basement : 1; /* set when the basement is built */ + u8 hra_reward0 : 1; /* earned 70k HRA points reward */ + u8 hra_reward1 : 1; /* earned 100k HRA points reward */ + u8 bit_6 : 1; /* unused */ + u8 bit_7 : 1; /* unused */ } mHm_flg_c; /* sizeof(mHm_hs_c) == 0x26B0 */ typedef struct home_s { - /* 0x0000 */ PersonalID_c ownerID; /* owner player's ID */ - /* 0x0014 */ u8 unk_14[6]; - /* 0x001A */ TempoBeat_c haniwa_tempo; /* unsure about this */ - /* 0x001C */ lbRTC_ymd_c hra_mark_time; /* last HRA judge date */ - /* 0x0020 */ u32 hra_mark_info; /* bitfield of HRA info pulled when HRA mails letter */ - /* 0x0024 */ mHm_flg_c flags; - /* 0x0026 */ mHm_rmsz_c size_info; /* home size info */ - /* 0x002C */ u8 outlook_pal; /* current house palette */ - /* 0x002D */ u8 ordered_outlook_pal; /* house palette ordered at Nook's via upgrade */ - /* 0x002E */ u8 next_outlook_pal; /* next house palette set via all other means (villager, Wisp, paint @ Nook's, ...) */ - /* 0x002F */ u8 door_original; /* player design shown on door, apparently called 'original', maybe 'original design'? */ - /* 0x0030 */ u8 unk_30[8]; /* unused? */ - /* 0x0038 */ mHm_flr_c floors[mHm_ROOM_NUM]; /* house floors, might be a union idk */ - /* 0x1A30 */ Mail_c mailbox[HOME_MAILBOX_SIZE]; /* mailbox */ - /* 0x25D4 */ Haniwa_c haniwa; /* gyroid info */ - /* 0x2678 */ mHm_goki_c goki; /* cockroach info */ - /* 0x2684 */ u32 music_box[2]; /* bitfield of inserted music */ - /* 0x268C */ u8 unk_286C[36]; /* unused? */ + /* 0x0000 */ PersonalID_c ownerID; /* owner player's ID */ + /* 0x0014 */ u8 unk_14[6]; + /* 0x001A */ TempoBeat_c haniwa_tempo; /* unsure about this */ + /* 0x001C */ lbRTC_ymd_c hra_mark_time; /* last HRA judge date */ + /* 0x0020 */ u32 hra_mark_info; /* bitfield of HRA info pulled when HRA mails letter */ + /* 0x0024 */ mHm_flg_c flags; + /* 0x0026 */ mHm_rmsz_c size_info; /* home size info */ + /* 0x002C */ u8 outlook_pal; /* current house palette */ + /* 0x002D */ u8 ordered_outlook_pal; /* house palette ordered at Nook's via upgrade */ + /* 0x002E */ u8 + next_outlook_pal; /* next house palette set via all other means (villager, Wisp, paint @ Nook's, ...) */ + /* 0x002F */ u8 + door_original; /* player design shown on door, apparently called 'original', maybe 'original design'? */ + /* 0x0030 */ u8 unk_30[8]; /* unused? */ + /* 0x0038 */ mHm_flr_c floors[mHm_ROOM_NUM]; /* house floors, might be a union idk */ + /* 0x1A30 */ Mail_c mailbox[HOME_MAILBOX_SIZE]; /* mailbox */ + /* 0x25D4 */ Haniwa_c haniwa; /* gyroid info */ + /* 0x2678 */ mHm_goki_c goki; /* cockroach info */ + /* 0x2684 */ u32 music_box[2]; /* bitfield of inserted music */ + /* 0x268C */ u8 unk_286C[36]; /* unused? */ } mHm_hs_c; /* sizeof(mHm_cottage_c) == 0x8C8 */ typedef struct home_cottage_s { - /* 0x000 */ mHm_wf_c unused_wall_floor; /* Has wallpaper & flooring bounds checks in sChk_CheckSaveData_Cattage */ - /* 0x002 */ u8 unk_2[2]; /* struct/array that is two bytes long, maybe another wall floor? */ - /* 0x004 */ u8 unk_4; /* direct copy in agb_to_gc_cottage, GBA only? */ - /* 0x005 */ u8 unk_5; /* direct copy in agb_to_gc_cottage, GBA only? */ - /* 0x008 */ mHm_flr_c room; /* Cottage room */ - /* 0x8B0 */ mHm_goki_c goki; /* Cottage cockroaches */ - /* 0x8BC */ u32 music_box[2]; /* Cottage music storage... separate from main home? */ + /* 0x000 */ mHm_wf_c unused_wall_floor; /* Has wallpaper & flooring bounds checks in sChk_CheckSaveData_Cattage */ + /* 0x002 */ u8 unk_2[2]; /* struct/array that is two bytes long, maybe another wall floor? */ + /* 0x004 */ u8 unk_4; /* direct copy in agb_to_gc_cottage, GBA only? */ + /* 0x005 */ u8 unk_5; /* direct copy in agb_to_gc_cottage, GBA only? */ + /* 0x008 */ mHm_flr_c room; /* Cottage room */ + /* 0x8B0 */ mHm_goki_c goki; /* Cottage cockroaches */ + /* 0x8BC */ u32 music_box[2]; /* Cottage music storage... separate from main home? */ } mHm_cottage_c; #ifdef __cplusplus diff --git a/include/m_name_table.h b/include/m_name_table.h index dde35fab..ff03aee2 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -1100,7 +1100,7 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define FTR_CLOTH_MANNIQUIN254_WEST 0x1BA7 #define FTR_CLOTH_END FTR_CLOTH_MANNIQUIN254_WEST #define FTR_CLOTH_MANNIQUIN_MY_ORIGINAL0 0x1BA8 - +#define FTR_CLOTH_MYMANNIQUIN_END 0x1BC7 #define FTR_INSECT_START 0x1BC8 #define FTR_INSECT00 FTR_INSECT_START diff --git a/src/ac_furniture_data.c_inc b/src/ac_furniture_data.c_inc new file mode 100644 index 00000000..a905e8e2 --- /dev/null +++ b/src/ac_furniture_data.c_inc @@ -0,0 +1,2603 @@ +typedef struct { + f32 x[2]; + f32 z[2]; + f32 edge[2]; +} aFTR_size_info_c; + +static aFTR_size_info_c l_size_typeA = { { 20.0f, 20.0f }, { 20.0f, 20.0f }, { 0.1f, 0.1f } }; +static aFTR_size_info_c l_size_typeB_90 = { { 60.0f, 20.0f }, { 20.0f, 20.0f }, { 0.1f, 0.05f } }; +static aFTR_size_info_c l_size_typeB_180 = { { 20.0f, 60.0f }, { 20.0f, 20.0f }, { 0.05f, 0.1f } }; +static aFTR_size_info_c l_size_typeB_270 = { { 20.0f, 20.0f }, { 60.0f, 20.0f }, { 0.1f, 0.05f } }; +static aFTR_size_info_c l_size_typeB_0 = { { 20.0f, 20.0f }, { 20.0f, 60.0f }, { 0.05f, 0.1 } }; +static aFTR_size_info_c l_size_typeC = { { 40.0f, 40.0f }, { 40.0f, 40.0f }, { 0.05f, 0.05f } }; + +static aFTR_size_info_c* aMR_furniture_size_table[] = { + &l_size_typeB_90, &l_size_typeB_180, &l_size_typeB_270, &l_size_typeB_0, &l_size_typeA, &l_size_typeC, +}; + +static aFTR_PROFILE* furniture_quality[] = { + &iam_sum_hal_chest02, + &iam_sum_clchest03, + &iam_sum_blue_bureau01, + &iam_kob_locker1, + &iam_sum_x_chest01, + &iam_sum_whi_chest02, + &iam_sum_ratan_chest02, + &iam_sum_log_chest02, + &iam_sum_liccachest, + &iam_sum_gre_chest02, + &iam_sum_fruitchest03, + &iam_sum_cont_chest02, + &iam_sum_blue_cab01, + &iam_sum_bla_chest03, + &iam_sum_asi_chest03, + &iam_sum_x_chest02, + &iam_sum_whi_chest01, + &iam_sum_ratan_chest01, + &iam_sum_log_chest01, + &iam_sum_liccalowchest, + &iam_sum_hal_chest03, + &iam_sum_gre_chest03, + &iam_sum_fruitchest01, + &iam_sum_cont_chest03, + &iam_sum_classicchest01, + &iam_sum_blue_lowchest01, + &iam_sum_bla_chest01, + &iam_sum_asi_chest02, + &iam_nog_tri_chest01, + &iam_nog_tri_chest02, + &iam_nog_tri_chest03, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_nog_fan01, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_ari_isu01, + &iam_ari_table01, + &iam_ari_reizou01, + &iam_dummy, + &iam_dummy, + &iam_sum_sofe01, + &iam_sum_sofe02, + &iam_dummy, + &iam_ari_kitchen01, + &iam_sum_sofe03, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_sum_guitar01, + &iam_sum_guitar02, + &iam_sum_guitar03, + &iam_sum_doll01, + &iam_sum_doll02, + &iam_sum_doll03, + &iam_sum_doll04, + &iam_sum_classiccabinet01, + &iam_sum_classicchair01, + &iam_sum_classicchest02, + &iam_sum_classictable01, + &iam_sum_classicwardrope01, + &iam_sum_clchair02, + &iam_sum_cupboard01, + &iam_sum_desk01, + &iam_sum_doll05, + &iam_sum_doll06, + &iam_sum_doll07, + &iam_sum_doll08, + &iam_sum_doll09, + &iam_sum_doll10, + &iam_sum_globe01, + &iam_sum_kitchair01, + &iam_sum_kittable01, + &iam_sum_tv01, + &iam_sum_totemp01, + &iam_sum_totemp02, + &iam_sum_totemp03, + &iam_sum_totemp04, + &iam_sum_taiko01, + &iam_sum_stove01, + &iam_sum_stereo01, + &iam_sum_ratan_isu01, + &iam_sum_oldsofa01, + &iam_sum_liccatable, + &iam_sum_liccasofa, + &iam_sum_liccapiano, + &iam_sum_liccalanp, + &iam_sum_liccakitchen, + &iam_sum_liccachair, + &iam_sum_liccabed, + &iam_sum_oldclk01, + &iam_sum_ratan_bed01, + &iam_sum_golfbag01, + &iam_sum_golfbag02, + &iam_sum_golfbag03, + &iam_sum_bookcht01, + &iam_sum_chair01, + &iam_sum_cont_sofa01, + &iam_sum_cont_sofa02, + &iam_sum_cont_table01, + &iam_sum_cont_cab01, + &iam_sum_cont_chest01, + &iam_sum_cont_chair01, + &iam_sum_cont_bed01, + &iam_sum_cont_table02, + &iam_sum_comp01, + &iam_kob_jimudesk, + &iam_kob_mastersword, + &iam_kob_ncube, + &iam_sum_tekin01, + &iam_sum_biwa01, + &iam_sum_conga01, + &iam_sum_shoukaki, + &iam_sum_col_chair01, + &iam_sum_col_chair02, + &iam_sum_col_chair03, + &iam_sum_conpo01, + &iam_kob_pipeisu, + &iam_sum_liccamirror, + &iam_sum_pet01, + &iam_sum_timpani01, + &iam_dummy, + &iam_sum_bdcake01, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_sum_sabo01, + &iam_sum_sabo02, + &iam_sum_clbed02, + &iam_sum_tv02, + &iam_sum_liccalowtable, + &iam_dummy, + &iam_dummy, + &iam_sum_touro01, + &iam_sum_touro02, + &iam_sum_touro03, + &iam_kob_jimuisu, + &iam_kob_getabako1, + &iam_kob_getabako2, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_kob_rika_desk, + &iam_dummy, + &iam_sum_touro04, + &iam_sum_taru01, + &iam_sum_taru02, + &iam_kob_tobibako, + &iam_kon_tukue, + &iam_sum_mezaclock, + &iam_sum_poptable01, + &iam_sum_poptable02, + &iam_sum_poptable03, + &iam_kon_tubo, + &iam_sum_popchair01, + &iam_sum_popchair02, + &iam_sum_popchair03, + &iam_sum_suberi01, + &iam_sum_wc01, + &iam_sum_wc02, + &iam_tak_table02, + &iam_tak_isu03, + &iam_kon_tubo2, + &iam_kon_tubo3, + &iam_sum_misin01, + &iam_sum_billiads, + &iam_sum_art01, + &iam_ike_art_ang, + &iam_ike_art_sya, + &iam_sum_art04, + &iam_sum_art05, + &iam_sum_art06, + &iam_ike_art_fel, + &iam_sum_art08, + &iam_sum_art09, + &iam_sum_art10, + &iam_sum_art11, + &iam_sum_art12, + &iam_sum_art13, + &iam_sum_art14, + &iam_sum_art15, + &iam_sum_fruitbed01, + &iam_sum_fruitchair01, + &iam_dummy, + &iam_sum_fruittable01, + &iam_sum_fruittv01, + &iam_sum_takkyu, + &iam_sum_harp, + &iam_sum_log_hatoclk, + &iam_sum_kisha, + &iam_sum_mizunomi, + &iam_sum_okiagari01, + &iam_dummy, + &iam_sum_slot, + &iam_sum_asi_chair01, + &iam_sum_asi_chair02, + &iam_sum_asi_chest01, + &iam_sum_asi_lanp01, + &iam_sum_pl_caladium01, + &iam_sum_pl_shuroci, + &iam_sum_asi_screen01, + &iam_sum_asi_table01, + &iam_sum_asi_taiko, + &iam_sum_bla_bed01, + &iam_dummy, + &iam_sum_bla_chest02, + &iam_sum_bla_desk01, + &iam_sum_bla_sofa02, + &iam_sum_bla_table01, + &iam_sum_blue_bed01, + &iam_sum_blue_bench01, + &iam_sum_blue_chair01, + &iam_sum_blue_chest01, + &iam_sum_blue_chest02, + &iam_sum_blue_table01, + &iam_sum_gre_bed01, + &iam_sum_gre_chair01, + &iam_sum_gre_chair02, + &iam_sum_gre_chest01, + &iam_sum_gre_counter01, + &iam_sum_gre_lanp01, + &iam_sum_gre_table01, + &iam_sum_log_bed01, + &iam_sum_log_chair01, + &iam_sum_log_chair02, + &iam_sum_log_chest03, + &iam_sum_log_table01, + &iam_sum_pl_aloe01, + &iam_sum_pl_ananas, + &iam_sum_pl_cocos, + &iam_sum_pl_compacta, + &iam_sum_pl_dracaena, + &iam_sum_pl_gomunoki, + &iam_sum_pl_pothos, + &iam_sum_pl_yamayasi, + &iam_sum_fruittable02, + &iam_sum_fruitchair02, + &iam_sum_pl_benjyami, + &iam_sum_pl_draca02, + &iam_sum_pl_kuroton, + &iam_sum_pl_pakila, + &iam_sum_pl_hirasabo, + &iam_tak_metro, + &iam_kon_sisiodosi, + &iam_sum_bon_matu01, + &iam_sum_bon_matu02, + &iam_tak_barber, + &iam_sum_bon_matu03, + &iam_sum_bon_ume, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_sum_bon_boke, + &iam_sum_bon_satuki, + &iam_sum_bon_sanshu, + &iam_kon_cracker, + &iam_tak_cone01, + &iam_dummy, + &iam_tak_cone03, + &iam_dummy, + &iam_sum_bon_momiji, + &iam_sum_bon_pira, + &iam_sum_bon_turu, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_kon_jihanki02, + &iam_tak_hole01, + &iam_kon_jihanki03, + &iam_dummy, + &iam_tak_drum02, + &iam_dummy, + &iam_dummy, + &iam_tak_tekkin, + &iam_dummy, + &iam_dummy, + &iam_sum_fruitchair03, + &iam_sum_fruitchair04, + &iam_sum_fruittable03, + &iam_dummy, + &iam_kon_gomi03, + &iam_kon_gomi04, + &iam_sum_viola01, + &iam_sum_bass01, + &iam_sum_cello01, + &iam_sum_piano01, + &iam_dummy, + &iam_tak_neko, + &iam_dummy, + &iam_sum_hal_pkin, + &iam_dummy, + &iam_tak_yaji, + &iam_kon_isi01, + &iam_kon_isi02, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_sum_hal_bed01, + &iam_sum_hal_box01, + &iam_sum_hal_chair01, + &iam_dummy, + &iam_sum_hal_chest01, + &iam_sum_hal_sofa01, + &iam_sum_hal_table01, + &iam_tak_apollo1, + &iam_tak_eisei, + &iam_kon_isi03, + &iam_kon_isi04, + &iam_kon_isi05, + &iam_tak_ufo, + &iam_kon_isi06, + &iam_kon_pound, + &iam_tak_rocket1, + &iam_tak_astro, + &iam_sum_hal_clk01, + &iam_sum_hal_lanp01, + &iam_sum_asi_bed01, + &iam_sum_asi_table02, + &iam_tak_asteroid1, + &iam_sum_ratan_lanp, + &iam_sum_ratan_table01, + &iam_dummy, + &iam_kon_taiju, + &iam_dummy, + &iam_dummy, + &iam_sum_ratan_screen, + &iam_sum_ratan_mirror, + &iam_sum_ratan_isu02, + &iam_sum_ratan_chest03, + &iam_tak_arwing, + &iam_tak_mooncar, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_sum_blue_clk, + &iam_tak_moti, + &iam_sum_hal_mirror01, + &iam_sum_gre_desk01, + &iam_dummy, + &iam_sum_bla_chair02, + &iam_sum_bla_table02, + &iam_tak_station, + &iam_dummy, + &iam_sum_log_chair03, + &iam_sum_whi_bed01, + &iam_tak_shuttle, + &iam_sum_whi_mirror, + &iam_sum_whi_sofa01, + &iam_sum_whi_lanp, + &iam_sum_log_table02, + &iam_dummy, + &iam_dummy, + &iam_sum_uwa_cup01, + &iam_sum_uwa_poto01, + &iam_sum_uwa_vase01, + &iam_sum_uwa_vase02, + &iam_sum_uwa_vase03, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_hnw_common, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_fmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_myfmanekin, + &iam_sum_monshiro, + &iam_sum_monki, + &iam_sum_kiageha, + &iam_sum_ohmurasaki, + &iam_sum_minmin, + &iam_sum_tukutuku, + &iam_sum_higurashi, + &iam_sum_abura, + &iam_sum_hachi, + &iam_sum_shiokara, + &iam_sum_akiakane, + &iam_sum_ginyanma, + &iam_sum_oniyanma, + &iam_sum_syouryou, + &iam_sum_tonosama, + &iam_sum_koorogi, + &iam_sum_kirigirisu, + &iam_sum_suzumushi, + &iam_sum_matumushi, + &iam_sum_kanabun, + &iam_sum_kabuto, + &iam_sum_hirata, + &iam_sum_tamamushi, + &iam_sum_gomadara, + &iam_sum_tentou, + &iam_sum_nanahoshi, + &iam_sum_kamakiri, + &iam_sum_genji, + &iam_sum_danna, + &iam_sum_nokogiri, + &iam_sum_miyama, + &iam_sum_okuwa, + &iam_nog_maimai, + &iam_nog_kera, + &iam_nog_amenbo, + &iam_nog_mino, + &iam_nog_dango, + &iam_nog_kumo, + &iam_nog_ari, + &iam_nog_ka, + &iam_sum_funa, + &iam_sum_hera, + &iam_sum_koi, + &iam_sum_nisiki, + &iam_sum_namazu, + &iam_sum_bass, + &iam_sum_bassm, + &iam_sum_bassl, + &iam_sum_gill, + &iam_sum_oonamazu, + &iam_sum_raigyo, + &iam_sum_nigoi, + &iam_sum_ugui, + &iam_sum_oikawa, + &iam_sum_tanago, + &iam_sum_dojyo, + &iam_sum_wakasagi, + &iam_sum_ayu, + &iam_sum_yamame, + &iam_sum_iwana, + &iam_sum_niji, + &iam_sum_ito, + &iam_sum_sake, + &iam_sum_kingyo, + &iam_sum_pirania, + &iam_sum_aroana, + &iam_sum_unagi, + &iam_sum_donko, + &iam_sum_angel, + &iam_sum_gupi, + &iam_sum_demekin, + &iam_sum_kaseki, + &iam_nog_zarigani, + &iam_nog_kaeru, + &iam_nog_medaka, + &iam_nog_kurage, + &iam_nog_suzuki, + &iam_nog_tai, + &iam_nog_isidai, + &iam_nog_piraluku, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_fumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_myfumbrella, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_famicom_common, + &iam_kob_disksystem8, + &iam_sum_chikuon01, + &iam_sum_chikuon02, + &iam_sum_jukebox, + &iam_sum_radio01, + &iam_sum_radio02, + &iam_sum_conpo02, + &iam_sum_stereo02, + &iam_sum_lv_stereo, + &iam_sum_x_lanp, + &iam_sum_x_chair01, + &iam_sum_x_chest03, + &iam_sum_x_sofa01, + &iam_sum_x_bed01, + &iam_sum_x_clk, + &iam_sum_x_table01, + &iam_sum_x_piano, + &iam_sum_doll11, + &iam_sum_roboconpo, + &iam_sum_saiconpo, + &iam_sum_fruitclk, + &iam_sum_roboclk, + &iam_kon_ameclock, + &iam_kon_atqclock, + &iam_sum_reco01, + &iam_sum_casse01, + &iam_sum_md01, + &iam_kon_grclock, + &iam_kon_waclock, + &iam_kon_redclock, + &iam_kon_blueclock, + &iam_kon_mimiclock, + &iam_dummy, + &iam_dummy, + &iam_kon_musya, + &iam_dummy, + &iam_dummy, + &iam_kon_xtree02, + &iam_nog_rookW, + &iam_nog_rookB, + &iam_nog_queenW, + &iam_nog_queenB, + &iam_nog_bishopW, + &iam_nog_bishopB, + &iam_nog_kingW, + &iam_nog_kingB, + &iam_nog_knightW, + &iam_nog_knightB, + &iam_nog_pawnW, + &iam_nog_pawnB, + &iam_nog_xtree, + &iam_nog_tri_clock01, + &iam_nog_tri_bed01, + &iam_nog_tri_table01, + &iam_nog_tri_sofa01, + &iam_nog_tri_audio01, + &iam_nog_tri_chair01, + &iam_nog_tri_rack01, + &iam_dummy, + &iam_dummy, + &iam_sum_kokuban, + &iam_sum_baketu, + &iam_din_trikera_head, + &iam_din_trikera_tail, + &iam_din_trikera_body, + &iam_din_trex_head, + &iam_din_trex_tail, + &iam_din_trex_body, + &iam_din_bront_head, + &iam_din_bront_tail, + &iam_din_bront_body, + &iam_din_stego_head, + &iam_din_stego_tail, + &iam_din_stego_body, + &iam_din_ptera_head, + &iam_din_ptera_Rwing, + &iam_din_ptera_Lwing, + &iam_din_hutaba_head, + &iam_din_hutaba_neck, + &iam_din_hutaba_body, + &iam_din_mammoth_head, + &iam_din_mammoth_body, + &iam_din_amber, + &iam_din_stump, + &iam_din_ammonite, + &iam_din_egg, + &iam_din_trilobite, + &iam_sum_bla_lanp, + &iam_kon_snowfreezer, + &iam_kon_snowtable, + &iam_kon_snowbed, + &iam_tak_snowisu, + &iam_tak_snowlamp, + &iam_kon_snowsofa, + &iam_kon_snowtv, + &iam_kon_snowtansu, + &iam_kon_snowbox, + &iam_kon_snowclock, + &iam_din_trikera_dummy, + &iam_din_trex_dummy, + &iam_din_bront_dummy, + &iam_din_ptera_dummy, + &iam_din_hutaba_dummy, + &iam_din_mammoth_dummy, + &iam_din_stego_dummyA, + &iam_din_stego_dummyB, + &iam_din_dummy, + &iam_tak_syogi, + &iam_ike_jny_makada01, + &iam_dummy, + &iam_ike_pst_pig01, + &iam_ike_pst_tesyu01, + &iam_ike_jny_afmen01, + &iam_ike_jny_rosia01, + &iam_hayakawa_famicom, + &iam_ike_jny_botle01, + &iam_ike_jny_hariko01, + &iam_ike_jny_moai01, + &iam_radio_test, + &iam_ike_jny_gojyu01, + &iam_ike_jny_kibori01, + &iam_ike_jny_truth01, + &iam_ike_jny_sirser01, + &iam_ike_jny_pisa01, + &iam_tak_lion, + &iam_ike_jny_syon01, + &iam_ike_jny_tower01, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_nog_balloon_common, + &iam_tak_megami, + &iam_ike_jny_gate01, + &iam_tak_money, + &iam_ike_jny_ningyo01, + &iam_nog_yubin, + &iam_nog_myhome2, + &iam_nog_myhome4, + &iam_nog_koban, + &iam_nog_museum, + &iam_tak_yoroi, + &iam_dummy, + &iam_dummy, + &iam_dummy, + &iam_ike_k_otome01, + &iam_nog_yamishop, + &iam_nog_uranai, + &iam_ike_jny_sirser201, + &iam_ike_k_tanabata01, + &iam_dummy, + &iam_dummy, + &iam_nog_shop1, + &iam_ike_jny_houi01, + &iam_dummy, + &iam_dummy, + &iam_tak_toudai, + &iam_ike_k_sum01, + &iam_nog_s_tree, + &iam_nog_f_tree, + &iam_nog_zassou, + &iam_tak_tailor, + &iam_nog_dump, + &iam_dummy, + &iam_nog_snowman, + &iam_ike_k_iveboy01, + &iam_dummy, + &iam_tak_moon, + &iam_ike_k_kid01, + &iam_iid_ningyou, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_station, + &iam_nog_shrine, + &iam_nog_flat, + &iam_nog_rail, + &iam_nog_earth, + &iam_ike_k_kid02, + &iam_nog_mikanbox, + &iam_nog_collegenote, + &iam_nog_schoolnote, + &iam_nog_systemnote, + &iam_nog_harddiary, + &iam_nog_tudurinote, + &iam_iid_diary, + &iam_iid_funediary, + &iam_iid_mdiary, + &iam_iid_newdiary, + &iam_tak_nikki01, + &iam_ike_nikki_fan1, + &iam_ike_nikki_fan2, + &iam_ike_nikki_fan3, + &iam_ike_nikki_fan4, + &iam_ike_nikki_fan5, + &iam_ike_nikki_wafu1, + &iam_gold_item, + &iam_gold_item, + &iam_gold_item, + &iam_gold_item, + &iam_utiwa, + &iam_utiwa, + &iam_utiwa, + &iam_utiwa, + &iam_utiwa, + &iam_utiwa, + &iam_utiwa, + &iam_utiwa, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_kazaguruma, + &iam_tool, + &iam_tool, + &iam_tool, + &iam_tool, + &iam_nog_nabe, + &iam_ike_kama_danro01, + &iam_nog_kamakura, + &iam_nog_w_tree, + &iam_tak_ice, + &iam_ike_island_hako01, + &iam_nog_beachbed, + &iam_nog_beachtable, + &iam_dummy, + &iam_iid_surf, + &iam_iid_snow, + &iam_tak_tetra, + &iam_ike_island_uku01, + &iam_ike_island_sensui01, + &iam_iid_yuki, + &iam_dummy, + &iam_dummy, + &iam_tak_sori01, + &iam_iid_benti, + &iam_tak_cube, + &iam_iku_denko, + &iam_yaz_rocket, + &iam_iku_slip, + &iam_iku_ukai, + &iam_iku_work, + &iam_hos_deskL, + &iam_hos_deskR, + &iam_hos_flip, + &iam_iku_flagman, + &iam_yaz_fish_trophy, + &iam_iku_jersey, + &iam_iku_reducespeed, + &iam_dummy, + &iam_hos_Tdesk, + &iam_iku_hazardous_top, + &iam_dummy, + &iam_iku_sawhousev, + &iam_dummy, + &iam_iku_bugzapper, + &iam_yaz_telescope, + &iam_iku_cocoa, + &iam_yaz_b_bath, + &iam_sugi_barbecue, + &iam_sugi_radiatorl, + &iam_sugi_alchair, + &iam_sugi_chesstable, + &iam_iku_candy, + &iam_sugi_kpool, + &iam_iku_cement, + &iam_iku_jack, + &iam_sugi_torch, + &iam_yaz_b_house, + &iam_yos_pbstove, + &iam_iku_busstop, + &iam_tak_ham1, + &iam_iku_flip_top, + &iam_yos_kflag, + &iam_tak_nes01, + &iam_yos_b_feeder, + &iam_iku_chair, + &iam_iku_roller, + &iam_yos_flamingo, + &iam_yos_mailbox, + &iam_yaz_candle, + &iam_iku_ham, + &iam_yos_gnome, + &iam_yos_flamingo2, + &iam_iku_gold_green, + &iam_iku_gold_red, + &iam_iku_tumble, + &iam_iku_cow, + &iam_iku_orange, + &iam_iku_saku_a, + &iam_iku_saku_b, + &iam_yaz_tub, + &iam_yos_luigi, + &iam_yos_mario, + &iam_iku_turkey_lamp, + &iam_yaz_wagon, + &iam_yos_terrace, + &iam_hos_piknic, + &iam_iku_turkey_table, + &iam_iku_turkey_TV, + &iam_iku_turkey_bed, + &iam_yaz_turkey_chair, + &iam_yos_turkey_watch, + &iam_hos_turkey_sofa, + &iam_iku_mario_dokan, + &iam_iku_mario_renga, + &iam_yaz_turkey_closet, + &iam_hos_mario_hata, + &iam_yaz_turkey_chest, + &iam_hos_mario_kinoko, + &iam_yos_turkey_mirror, + &iam_iku_mario_coin, + &iam_iku_mario_hatena, + &iam_iku_mario_star, + &iam_iku_mario_koura, + &iam_iku_mario_taihou, + &iam_yos_cactus, + &iam_yaz_mario_flower, + &iam_yos_wheel, + &iam_iku_ido, + &iam_ike_prores_fense01, + &iam_ike_prores_ling01, + &iam_ike_prores_ling02, + &iam_ike_prores_ling03, + &iam_ike_prores_mat01, + &iam_ike_prores_table01, + &iam_ike_prores_punch01, + &iam_ike_prores_sandbag01, + &iam_ike_prores_bench01, + &iam_ike_tent_fire01, + &iam_ike_tent_fire02, + &iam_ike_tent_kayak01, + &iam_nog_sprinkler, + &iam_tak_tent, + &iam_ike_tent_knap01, + &iam_ike_fish_tro2, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_nog_flower, + &iam_tak_tent_lamp, + &iam_nog_lawnmower, + &iam_tak_tent_box, + &iam_ike_tent_bike01, + &iam_ike_tent_sleepbag01, + &iam_nog_burner, + &iam_nog_cornucopia, + &iam_nog_gong, + &iam_tak_noise, + &iam_tak_stew, + &iam_dummy, +}; + +// clang-format off +static u8 l_place_table[] = { + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, +}; +// clang-format on + +// clang-format off +static u8 l_place_table2[] = { + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, + 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201 +}; +// clang-format on + +static u8* aMR_place_table[] = { + l_place_table, + l_place_table2, +}; + +// clang-format off +static u8 aMR_layer_set_info[] = { + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_NORMAL, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_ON_SURFACE, + aFTR_SET_TYPE_NORMAL, +}; +// clang-format on diff --git a/src/ac_my_room.c b/src/ac_my_room.c new file mode 100644 index 00000000..36304007 --- /dev/null +++ b/src/ac_my_room.c @@ -0,0 +1,2274 @@ +#include "ac_my_room.h" + +#include "m_bgm.h" +#include "m_name_table.h" +#include "ac_furniture.h" +#include "f_furniture.h" +#include "m_common_data.h" +#include "libultra/libultra.h" +#include "m_malloc.h" +#include "m_cockroach.h" +#include "m_msg.h" +#include "dolphin/card.h" + +enum { + aMR_ICON_LEAF, + aMR_ICON_HANIWA, + aMR_ICON_CLOTH, + aMR_ICON_UMBRELLA, + aMR_ICON_BONE, + aMR_ICON_DIARY, + + aMR_ICON_NUM +}; + +/* Inclusive bounds */ +#define aMR_MIN_BOUND 1 +#define aMR_MAX_BOUND 8 + +#define aMR_FTR_BANK_NUM 100 +#define aMR_FTR_BANK_SIZE 0x800 + +#define aMR_CLIP (Common_Get(clip).my_room_clip) +#define aMR_BOUNDS_OK(x, z) \ + ((x) > (aMR_MIN_BOUND - 1) && (x) < (aMR_MAX_BOUND + 1) && (z) > (aMR_MIN_BOUND - 1) && (z) < (aMR_MAX_BOUND + 1)) + +enum { + aMR_MSG_STATE_NONE, + aMR_MSG_STATE_WAIT_MSG, + aMR_MSG_STATE_OWNER_NO_ITEM, + aMR_MSG_STATE_OWNER_EXIST_ITEM, + aMR_MSG_STATE_OWNER_EXIST_ITEM_ITEM_COUNT2, + aMR_MSG_STATE_OWNER_WHICH_PUT_OUT1, + aMR_MSG_STATE_OWNER_WHICH_PUT_OUT2, + aMR_MSG_STATE_OWNER_WHICH_PUT_OUT3, + aMR_MSG_STATE_OWNER_WAIT_WHICH_PUT_OUT, + aMR_MSG_STATE_OTHER_NO_ITEM, + aMR_MSG_STATE_OTHER_EXIST_ITEM1, + aMR_MSG_STATE_OTHER_EXIST_ITEM2, + aMR_MSG_STATE_OTHER_EXIST_ITEM3, + aMR_MSG_STATE_FULL_PLAYER_ITEM, + aMR_MSG_STATE_OPEN_SUBMENU, + aMR_MSG_STATE_ITEM_PUT_IN, + aMR_MSG_STATE_WAIT_CLOSE_FTR, + aMR_MSG_STATE_REQUEST_CLOSE_FTR, + aMR_MSG_STATE_REQUEST_FULL_BAG, + aMR_MSG_STATE_CAN_NOT_CLEAN, + aMR_MSG_STATE_CAN_NOT_CLEAN_MD, + aMR_MSG_STATE_OPEN_SET_ITEM_SUBMENU, + aMR_MSG_STATE_ITEM_SET_SUBMENU, + aMR_MSG_STATE_WAIT_MD, + aMR_MSG_STATE_OWNER_NO_MD, + aMR_MSG_STATE_OWNER_EXIST_MD, + aMR_MSG_STATE_OWNER_EXIST_MD2, + aMR_MSG_STATE_OTHER_NO_MD, + aMR_MSG_STATE_OTHER_EXIST_MD, + aMR_MSG_STATE_FULL_PLAYER_MD, + aMR_MSG_STATE_OPENMD_SUBMENU, + aMR_MSG_STATE_MD_PUT_IN, + aMR_MSG_STATE_OPEN_MUSIC_BOX, + aMR_MSG_STATE_MUSIC_BOX_MD_PUT_IN, + aMR_MSG_STATE_WAIT_CLOSE_MD, + aMR_MSG_STATE_REQUEST_CLOSE_MD, + aMR_MSG_STATE_REQUEST_FULL_BAG_MD, + aMR_MSG_STATE_CAN_NOT_MD_CLEAN, + aMR_MSG_STATE_OPEN_EXCHANGE_MD_SUBMENU, + aMR_MSG_STATE_MD_EXCHANGE_SUBMENU, + aMR_MSG_STATE_QQQ_EMULATOR, + aMR_MSG_STATE_EXPLAIN_EMULATOR, + aMR_MSG_STATE_QQQ_EMULATOR_MEMORY1, + aMR_MSG_STATE_EXPLAIN_EMULATOR_MEMORY, + aMR_MSG_STATE_QQQ_EMULATOR_MEMORY2, + aMR_MSG_STATE_QQQ_EMULATOR_MEMORY_OVER3, + aMR_MSG_STATE_QQQ_REPEAT_DISPLAY1, + aMR_MSG_STATE_QQQ_REPEAT_DISPLAY1_2, + aMR_MSG_STATE_QQQ_REPEAT_DISPLAY2, + aMR_MSG_STATE_QQQ_REPEAT_DISPLAY2_2, + aMR_MSG_STATE_NO_PACK_NO_DATA, + aMR_MSG_STATE_WARNING_CANNOT_MAKE_SAVE_FILE, + aMR_MSG_STATE_NO_PACK_NO_DATA1, + aMR_MSG_STATE_NO_PACK_NO_DATA2, + aMR_MSG_STATE_HITOKOTO, + aMR_MSG_STATE_HITOKOTO1, + aMR_MSG_STATE_HITOKOTO2, + aMR_MSG_STATE_SAVE_FAMICOM, + aMR_MSG_STATE_WAIT_FAMICOM_BATU, + aMR_MSG_STATE_PREPARE_COMMUNICATION, + aMR_MSG_STATE_NOT_CONNECT_AGB, + aMR_MSG_STATE_CHECK_AGB_PROGRAM, + aMR_MSG_STATE_DELETE_AGB_PROGRAMQ, + aMR_MSG_STATE_START_EMU_DOWN_LOAD, + aMR_MSG_STATE_RECHECK_AGB_CONNECT, + + aMR_MSG_STATE_NUM +}; + +#include "../src/ac_furniture_data.c_inc" +#include "../src/ac_my_room_data.c_inc" + +typedef struct my_room_work_s { + FTR_ACTOR* ftr_actor_list; + u8* used_list; + int list_size; +} aMR_work_c; + +static aMR_work_c l_aMR_work; +static u8 l_bank_index_table[FTR_NUM]; +static u8* l_bank_address_table[aMR_FTR_BANK_NUM]; + +const f32 aMR_angle_table[4] = { 0.0f, 90.0f, 180.0f, 270.0f }; +const u8 l_typeB0_table[4] = { aFTR_SHAPE_TYPEB_0, aFTR_SHAPE_TYPEB_90, aFTR_SHAPE_TYPEB_180, aFTR_SHAPE_TYPEB_270 }; + +static int aMR_UnitNum2FtrItemNoFtrID(mActor_name_t* item_no, int* ftr_id, int ut_x, int ut_z, int layer); +static void aMR_ReserveDefaultBgm(ACTOR* actorx, FTR_ACTOR* ftr_actor); +static void aMR_ChangeMDBgm(ACTOR* actorx, FTR_ACTOR* ftr_actor); +static void aMR_SetFurniture2FG(FTR_ACTOR* ftr_actor, xyz_t pos, int on_flag); + +static aFTR_PROFILE* aMR_GetFurnitureProfile(u16 ftr_no) { + if (ftr_no < FTR_NUM) { + if (furniture_quality[ftr_no] != NULL) { + return furniture_quality[ftr_no]; + } + } else { + return &iam_dummy; + } + + return &iam_dummy; +} + +static int aMR_GetItemCountInFurniture(FTR_ACTOR* ftr_actor) { + int count = 0; + int i; + + for (i = 0; i < aFTR_KEEP_ITEM_COUNT; i++) { + if (ftr_actor->items[i] != EMPTY_NO) { + count++; + } + } + + return count; +} + +static void aMR_TidyItemInFurniture(FTR_ACTOR* ftr_actor) { + mActor_name_t temp_items[aFTR_KEEP_ITEM_COUNT]; + mActor_name_t* dst_p; + int i; + + for (i = 0; i < aFTR_KEEP_ITEM_COUNT; i++) { + temp_items[i] = ftr_actor->items[i]; + ftr_actor->items[i] = EMPTY_NO; + } + + dst_p = ftr_actor->items; + for (i = 0; i < aFTR_KEEP_ITEM_COUNT; i++) { + if (temp_items[i] != EMPTY_NO) { + *dst_p++ = temp_items[i]; + } + } +} + +static int aMR_ItemPutInFurniture(FTR_ACTOR* ftr_actor, mActor_name_t item) { + int i; + + for (i = 0; i < aFTR_KEEP_ITEM_COUNT; i++) { + if (ftr_actor->items[i] == EMPTY_NO) { + ftr_actor->items[i] = item; + return TRUE; + } + } + + return FALSE; +} + +static int aMR_ItemNo2IconNo(mActor_name_t item_no) { + if (ITEM_IS_FTR(item_no)) { + if (item_no >= FTR_COLLEGERULE && item_no <= FTR_CALLIGRAPHY_PAD_WEST) { + return aMR_ICON_DIARY; + } + + if (item_no >= HANIWA_START && item_no <= HANIWA_END) { + return aMR_ICON_HANIWA; + } + + if ((item_no >= FTR_UMBRELLA_START && item_no <= FTR_UMBRELLA_END) || + (item_no >= FTR_UMBRELLA_START && item_no <= FTR_MYUMBRELLA_END)) { + return aMR_ICON_UMBRELLA; + } + + if ((item_no >= FTR_CLOTH_START && item_no <= FTR_CLOTH_END) || + (item_no >= FTR_CLOTH_START && item_no <= FTR_CLOTH_MYMANNIQUIN_END)) { + return aMR_ICON_CLOTH; + } + + if (item_no >= FTR_DINO_START && item_no <= FTR_DINO_END) { + return aMR_ICON_BONE; + } + + return aMR_ICON_LEAF; + } + + return aMR_ICON_LEAF; +} + +static Gfx* aMR_IconNo2Gfx1(int icon_no) { + aMR_icon_display_data_c* icon; + + if (icon_no < 0) { + icon_no = 0; + } else if (icon_no >= aMR_ICON_NUM) { + icon_no = aMR_ICON_NUM - 1; + } + + return aMR_icon_display_data[icon_no].mat_gfx; +} + +static Gfx* aMR_IconNo2Gfx2(int icon_no) { + if (icon_no < 0) { + icon_no = 0; + } else if (icon_no >= aMR_ICON_NUM) { + icon_no = aMR_ICON_NUM - 1; + } + + return aMR_icon_display_data[icon_no].vtx_gfx; +} + +static mActor_name_t* aMR_GetLayerTopFg(s16 layer) { + return mFI_BkNum2UtFGTop_layer(0, 0, layer); +} + +u64* aMR_GetBitSwitchTable(int layer, MY_ROOM_ACTOR* my_room) { + mActor_name_t field_id = mFI_GetFieldId(); + + if (my_room->scene == SCENE_COTTAGE_MY) { + return &(&Save_Get(island).cottage.room.layer_main)[layer].ftr_switch; + } + + if ((mFI_GET_TYPE(field_id) == mFI_FIELD_PLAYER0_ROOM)) { + int idx = (mFI_GetFieldId() - mFI_FIELD_PLAYER0_ROOM) & 3; + + if (aMR_CLIP != NULL && aMR_CLIP->my_room_actor_p != NULL) { + int floor_no = mFI_GetPlayerHouseFloorNo(((MY_ROOM_ACTOR*)aMR_CLIP->my_room_actor_p)->scene); + + if (floor_no != -1) { + return &(&Save_Get(homes[idx]).floors[floor_no].layer_main)[layer].ftr_switch; + } + } + } + + return NULL; +} + +u32* aMR_GetHaniwaStepSaveData(s16 layer, MY_ROOM_ACTOR* my_room) { + mActor_name_t field_id = mFI_GetFieldId(); + + if (my_room->scene == SCENE_COTTAGE_MY) { + return (&Save_Get(island).cottage.room.layer_main)[layer].haniwa_step; + } + + if ((mFI_GET_TYPE(field_id) == mFI_FIELD_PLAYER0_ROOM)) { + int idx = (mFI_GetFieldId() - mFI_FIELD_PLAYER0_ROOM) & 3; + int floor_no = mFI_GetPlayerHouseFloorNo(my_room->scene); + + if (floor_no != -1) { + return (&Save_Get(homes[idx]).floors[floor_no].layer_main)[layer].haniwa_step; + } + } + + return NULL; +} + +static void aMR_ClearBitSwitch(FTR_ACTOR* ftr_actor) { + ftr_actor->switch_bit = FALSE; + ftr_actor->haniwa_step = -1; +} + +static void aMR_GetSwitchBit(FTR_ACTOR* ftr_actor, s16 placing_flag, MY_ROOM_ACTOR* my_room) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (placing_flag == TRUE) { + ftr_actor->switch_bit = TRUE; + } else { + u64* ftr_bit_switch_table = aMR_GetBitSwitchTable(ftr_actor->layer, my_room); + xyz_t pos = ftr_actor->position; + int ut_x; + int ut_z; + + pos.x -= 1.0f; + pos.z -= 1.0f; + + if (ftr_bit_switch_table != NULL && ftr_actor->layer < mCoBG_LAYER2 && + mFI_Wpos2UtNum_inBlock(&ut_x, &ut_z, pos) && aMR_BOUNDS_OK(ut_x, ut_z)) { + if (((*ftr_bit_switch_table) >> ((ut_x - 1 + (ut_z - 1) * 8) & 0x3F) & 1)) { + ftr_actor->switch_bit = TRUE; + } else { + ftr_actor->switch_bit = FALSE; + } + } else if ((mFI_CheckShop() == TRUE || mFI_GetFieldId() == mFI_FIELD_ROOM_BROKER_SHOP) && profile != NULL && + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK)) { + ftr_actor->switch_bit = FALSE; // disable music players in shops + } else { + ftr_actor->switch_bit = TRUE; + } + } +} + +static void aMR_GetHaniwaStep(FTR_ACTOR* ftr_actor, s16 placing_flag, int* step_idx, MY_ROOM_ACTOR* my_room) { + if (placing_flag == TRUE) { + ftr_actor->haniwa_step = -1; + } else { + int layer = ftr_actor->layer; + int ut_x; + int ut_z; + + if (layer < mCoBG_LAYER2 && mFI_Wpos2UtNum_inBlock(&ut_x, &ut_z, ftr_actor->position) && + aMR_BOUNDS_OK(ut_x, ut_z)) { + u32* step_table = aMR_GetHaniwaStepSaveData(layer, my_room); + + if (step_table != NULL) { + int shift = (ut_x - 1) * 4; + int idx = ut_z - 1; + + ftr_actor->haniwa_step = (step_table[idx] >> shift) & 0xF; + } else if (*step_idx < mFM_HANIWA_STEP_NUM) { + u8* step = mFI_GetHaniwaStepBlock(0, 0); + + ftr_actor->haniwa_step = step[*step_idx]; + (*step_idx)++; + } else { + ftr_actor->haniwa_step = -1; + } + } else { + ftr_actor->haniwa_step = -1; + } + } +} + +static void aMR_OperateSwitchBit(FTR_ACTOR* ftr_actor) { + if (ftr_actor->switch_bit == FALSE) { + ftr_actor->switch_bit = TRUE; + } else { + ftr_actor->switch_bit = FALSE; + } +} + +static void aMR_SaveHaniwaStepData(MY_ROOM_ACTOR* my_room) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used == TRUE && ftr_actor->name < FTR_NUM) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (profile != NULL && aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_HANIWA)) { + int ut_x; + int ut_z; + + if (mFI_Wpos2UtNum_inBlock(&ut_x, &ut_z, ftr_actor->position) && aMR_BOUNDS_OK(ut_x, ut_z)) { + u32* step_data = aMR_GetHaniwaStepSaveData(ftr_actor->layer, my_room); + + if (step_data != NULL) { + int shift = (ut_x - 1) * 4; + int idx = ut_z - 1; + + step_data[idx] &= ~(0xF << shift); + step_data[idx] |= (ftr_actor->haniwa_step & 0xF) << shift; + } + } + } + } + + ftr_actor++; + used++; + } +} + +static void aMR_SaveOneFtrSwitchData(mActor_name_t ftr_name, int ut_x, int ut_z, s16 layer, u64* switch_bit_table) { + if (ITEM_IS_FTR(ftr_name)) { + mActor_name_t name; + int ftr_id; + + if (aMR_UnitNum2FtrItemNoFtrID(&name, &ftr_id, ut_x, ut_z, layer)) { + FTR_ACTOR* ftr_actor = &l_aMR_work.ftr_actor_list[ftr_id]; + + if (aMR_BOUNDS_OK(ut_x, ut_z)) { + int shift = (ut_x - 1 + (ut_z - 1) * 8) & 0x3F; + + if (ftr_actor->switch_bit) { + (*switch_bit_table) |= 1ull << shift; + } + } + } + } +} + +static void aMR_SaveSwitchData(MY_ROOM_ACTOR* my_room) { + if (l_aMR_work.ftr_actor_list != NULL && l_aMR_work.used_list != NULL) { + u64* bit_switch_table; + int ut_x; + int ut_z; + int layer; + mActor_name_t* fg_p; + + for (layer = mCoBG_LAYER0; layer < mCoBG_LAYER2; layer++) { + bit_switch_table = aMR_GetBitSwitchTable(layer, my_room); + + if (bit_switch_table != NULL) { + *bit_switch_table = 0; + fg_p = aMR_GetLayerTopFg(layer); + + if (fg_p != NULL) { + for (ut_z = aMR_MIN_BOUND; ut_z <= aMR_MAX_BOUND; ut_z++) { + for (ut_x = aMR_MIN_BOUND; ut_x <= aMR_MAX_BOUND; ut_x++) { + aMR_SaveOneFtrSwitchData(fg_p[ut_x + ut_z * UT_X_NUM], ut_x, ut_z, layer, bit_switch_table); + } + } + } + } + } + } +} + +static int aMR_CountFriendFurniture(FTR_ACTOR* ftr_actor, u8 friend_type) { + u8* used = l_aMR_work.used_list; + FTR_ACTOR* check_ftr_actor = l_aMR_work.ftr_actor_list; + int count = 0; + int i = 0; + + if (check_ftr_actor != NULL && used != NULL) { + for (i; i < l_aMR_work.list_size; i++) { + if (*used == TRUE && i != ftr_actor->id) { + if (check_ftr_actor->name == ftr_actor->name) { + if (friend_type == aMR_FRIEND_ALL) { + count++; + } else if (friend_type == aMR_FRIEND_ON) { + if (check_ftr_actor->switch_bit != FALSE) { + count++; + } + } else { /* aMR_FRIEND_OFF */ + if (check_ftr_actor->switch_bit == FALSE) { + count++; + } + } + } + } + + check_ftr_actor++; + used++; + } + + return count; + } + + return 0; +} + +static int aMR_GetWeight(int type) { + return 1; +} + +static void aMR_PlussWeight(ACTOR* actorx, FTR_ACTOR* ftr_actor) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->weight += aMR_GetWeight(ftr_actor->shape_type); +} + +static void aMR_MinusWeight(ACTOR* actorx, FTR_ACTOR* ftr_actor) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->weight -= aMR_GetWeight(ftr_actor->shape_type); +} + +static int aMR_WeightPossible(ACTOR* actorx, int type) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if (aMR_GetWeight(type) + my_room->weight <= l_aMR_work.list_size) { + return TRUE; + } + + return FALSE; +} + +static int aMR_CheckFurnitureBankExist(u16 idx) { + if (l_bank_index_table[idx] != 255) { + return TRUE; + } + + return FALSE; +} + +static int aMR_GetFtrBankID(u16 idx) { + if (l_bank_index_table[idx] == 255) { + return -1; + } + + return l_bank_index_table[idx]; +} + +static u8* aMR_BankNo2BankAddress(int bank_no) { + if (bank_no == -1) { + return NULL; + } + + return l_bank_address_table[bank_no]; +} + +static u8* aMR_FtrNo2BankAddress(u16 ftr_no) { + return aMR_BankNo2BankAddress(aMR_GetFtrBankID(ftr_no)); +} + +static int aMR_SearchFurnitureBankVacancy(void) { + int i; + int count = 0; + + for (i = 0; i < FTR_NUM; i++) { + if (aMR_CheckFurnitureBankExist(i)) { + count++; + } + } + + if (count < l_aMR_work.list_size) { + return TRUE; + } + + return FALSE; +} + +static int aMR_SearchFreeFurnitureBankIdx(void) { + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + int j; + int count = 0; + + for (j = 0; j < FTR_NUM; j++) { + if (l_bank_index_table[j] == i) { + count++; + } + } + + if (count == 0) { + return i; + } + } + + return -1; +} + +static int aMR_SearchFreeFurnitureActorNumber(void) { + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + if (l_aMR_work.used_list[i] == FALSE) { + return i; + } + } + + return -1; +} + +// Part 1 + +static int aMR_CountAppointFurniture(u16 ftr_no) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + int count = 0; + + for (i = 0; i < l_aMR_work.list_size; i++) { + if (used[i]) { + if (ftr_no == ftr_actor[i].name) { + count++; + } + } + } + + return count; +} + +static int aMR_CountFurniture(void) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + int count = 0; + + if (ftr_actor != NULL && used != NULL) { + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used) { + count++; + } + + ftr_actor++; + used++; + } + } + + return count; +} + +static void aMR_UnitNumber2Position(xyz_t* pos, u8 type, int ut_x, int ut_z) { + pos->x = (f32)ut_x * mFI_UT_WORLDSIZE_X_F + mFI_UT_WORLDSIZE_HALF_X_F; + pos->y = 0.0f; + pos->z = (f32)ut_z * mFI_UT_WORLDSIZE_Z_F + mFI_UT_WORLDSIZE_HALF_Z_F; + + if (type == aFTR_SHAPE_TYPEC) { + pos->x += mFI_UT_WORLDSIZE_HALF_X_F; + pos->z += mFI_UT_WORLDSIZE_HALF_Z_F; + } +} + +static int aMR_Wpos2PlaceNumber(int* ut_x, int* ut_z, xyz_t pos, u8 type) { + if (type == aFTR_SHAPE_TYPEC) { + pos.x -= mFI_UT_WORLDSIZE_HALF_X_F; + pos.z -= mFI_UT_WORLDSIZE_HALF_Z_F; + } + + *ut_x = (int)(pos.x / mFI_UT_WORLDSIZE_X_F); + *ut_z = (int)(pos.z / mFI_UT_WORLDSIZE_Z_F); + + if (*ut_x < UT_X_NUM && *ut_z < UT_Z_NUM) { + return TRUE; + } + + return FALSE; +} + +static u8* aMR_GetLayerPlaceTable(s16 layer) { + if (layer == mCoBG_LAYER0) { + return aMR_place_table[0]; + } + + if (layer == mCoBG_LAYER1) { + return aMR_place_table[1]; + } + + return NULL; +} + +static int aMR_Direct2PlussUnit(int* ut_x, int* ut_z, int direct) { + switch (direct) { + case aMR_DIRECT_UP: + (*ut_z)--; + return TRUE; + case aMR_DIRECT_LEFT: + (*ut_x)--; + return TRUE; + case aMR_DIRECT_DOWN: + (*ut_z)++; + return TRUE; + case aMR_DIRECT_RIGHT: + (*ut_x)++; + return TRUE; + } + + return FALSE; +} + +static int aMR_GetTypeBPlaceInfo(int* x0, int* z0, int* x1, int* z1, u8 type, xyz_t pos) { + *x0 = (int)(pos.x / mFI_UT_WORLDSIZE_X_F); + *z0 = (int)(pos.z / mFI_UT_WORLDSIZE_Z_F); + + switch (type) { + case aFTR_SHAPE_TYPEB_90: + *x1 = *x0; + *z1 = *z0 - 1; + return TRUE; + case aFTR_SHAPE_TYPEB_180: + *x1 = *x0 - 1; + *z1 = *z0; + return TRUE; + case aFTR_SHAPE_TYPEB_270: + *x1 = *x0; + *z1 = *z0 + 1; + return TRUE; + case aFTR_SHAPE_TYPEB_0: + *x1 = *x0 + 1; + *z1 = *z0; + return TRUE; + } + + return FALSE; +} + +static void aMR_SetInfoFurnitureTable(u8 type, int idx, int id, s16 layer) { + u8* place_table = aMR_GetLayerPlaceTable(layer); + + switch (type) { + case aFTR_SHAPE_TYPEA: + place_table[idx] = id; + break; + case aFTR_SHAPE_TYPEB_90: + place_table[idx] = id; + place_table[idx - UT_X_NUM] = id; + break; + case aFTR_SHAPE_TYPEB_180: + place_table[idx] = id; + place_table[idx - 1] = id; + break; + case aFTR_SHAPE_TYPEB_270: + place_table[idx] = id; + place_table[idx + UT_X_NUM] = id; + break; + case aFTR_SHAPE_TYPEB_0: + place_table[idx] = id; + place_table[idx + 1] = id; + break; + case aFTR_SHAPE_TYPEC: + place_table[idx] = id; + place_table[idx + 1] = id; + place_table[idx + UT_X_NUM] = id; + place_table[idx + UT_X_NUM + 1] = id; + break; + } +} + +static void aMR_SetFurnitureType(FTR_ACTOR* ftr_actor, int angle) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (profile->shape == aFTR_SHAPE_TYPEB_0) { + ftr_actor->shape_type = l_typeB0_table[angle]; + ftr_actor->original_shape_type = profile->shape; + } else { + ftr_actor->shape_type = profile->shape; + ftr_actor->original_shape_type = profile->shape; + } +} + +static void aMR_SetFirstScale(FTR_ACTOR* ftr_actor) { + static xyz_t xyz0 = { 0.0f, 0.0f, 0.0f }; + static xyz_t xyz1 = { 1.0f, 1.0f, 1.0f }; + + if (ftr_actor->state == aFTR_STATE_BIRTH || ftr_actor->state == aFTR_STATE_BIRTH_WAIT) { + ftr_actor->scale = xyz0; + } else { + ftr_actor->scale = xyz1; + } + + if (ftr_actor->shape_type >= aFTR_SHAPE_TYPEB_90 && ftr_actor->shape_type <= aFTR_SHAPE_TYPEB_0) { + ftr_actor->birth_scale_modifier = 0.5f; + ftr_actor->birth_anim_step = 6000; + } else { + ftr_actor->birth_scale_modifier = 0.5f; + ftr_actor->birth_anim_step = 6000; + } + + ftr_actor->birth_anim_counter = 0; + ftr_actor->dust_timer = 0; +} + +static void aMR_DeleteFurnitreBank(u16 ftr_no) { + if (aMR_CountAppointFurniture(ftr_no) == 0) { + l_bank_index_table[ftr_no] = 255; + } +} + +static void aMR_InitHaniwaOnTable(ACTOR* actorx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + int* haniwa_on_table_p = my_room->haniwa_on_table; + int i; + + for (i = 0; i < aMR_HANIWA_ON_TABLE_NUM; i++, haniwa_on_table_p++) { + *haniwa_on_table_p = -1; + } +} + +static int aMR_GetHaniwaSwitchVac(ACTOR* actorx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + int* haniwa_on_table_p = my_room->haniwa_on_table; + int i; + + for (i = 0; i < aMR_HANIWA_ON_TABLE_NUM; i++) { + if (*haniwa_on_table_p == -1) { + return i; + } + haniwa_on_table_p++; + } + + return -1; +} + +static int aMR_TidyHaniwaOnTable(ACTOR* actorx, int idx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + int* haniwa_on_table_p = my_room->haniwa_on_table; + int i; + + if (idx >= 0 && idx < aMR_HANIWA_ON_TABLE_NUM) { + if (idx == (aMR_HANIWA_ON_TABLE_NUM - 1)) { + haniwa_on_table_p[idx] = -1; + } else { + for (i = idx; i < (aMR_HANIWA_ON_TABLE_NUM - 1); i++) { + haniwa_on_table_p[i] = haniwa_on_table_p[i + 1]; + } + + haniwa_on_table_p[aMR_HANIWA_ON_TABLE_NUM - 1] = -1; + } + + return TRUE; + } + + return FALSE; +} + +static int aMR_HaniwaOffReport(ACTOR* actorx, int ftr_idx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + int* haniwa_on_table_p = my_room->haniwa_on_table; + int i; + + for (i = 0; i < aMR_HANIWA_ON_TABLE_NUM; i++) { + if (*haniwa_on_table_p == ftr_idx) { + aMR_TidyHaniwaOnTable(actorx, i); + return TRUE; + } + + haniwa_on_table_p++; + } + + return FALSE; +} + +static int aMR_ClearHaniwaSwitch(ACTOR* actorx, FTR_ACTOR* ftr_actor) { + ftr_actor->switch_changed_flag = FALSE; + ftr_actor->switch_bit = FALSE; + return aMR_HaniwaOffReport(actorx, ftr_actor->id); +} + +static void aMR_HaniwaSwitchOn(ACTOR* actorx, FTR_ACTOR* ftr_actor) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + int free_idx = aMR_GetHaniwaSwitchVac(actorx); + int* haniwa_on_table_p = my_room->haniwa_on_table; + + if (free_idx == -1) { + int ftr_id = haniwa_on_table_p[0]; + + if (ftr_id >= 0) { + FTR_ACTOR* target_ftr_actor = l_aMR_work.ftr_actor_list + ftr_id; + + /* Turn off the old active gyroid */ + target_ftr_actor->switch_changed_flag = TRUE; + target_ftr_actor->switch_bit = FALSE; + aMR_HaniwaOffReport(actorx, target_ftr_actor->id); + + /* Turn on new one */ + ftr_actor->switch_changed_flag = TRUE; + ftr_actor->switch_bit = TRUE; + haniwa_on_table_p[aMR_HANIWA_ON_TABLE_NUM - 1] = ftr_actor->id; + } + } else { + ftr_actor->switch_changed_flag = TRUE; + ftr_actor->switch_bit = TRUE; + haniwa_on_table_p[free_idx] = ftr_actor->id; + } +} + +static void aMR_SetSwitchStepData(FTR_ACTOR* ftr_actor, s16 placed_flag, MY_ROOM_ACTOR* my_room) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_HANIWA)) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* l_my_room = (MY_ROOM_ACTOR*)actorx; + + if (placed_flag == TRUE) { + aMR_HaniwaSwitchOn(actorx, ftr_actor); + aMR_GetHaniwaStep(ftr_actor, placed_flag, &l_my_room->haniwa_step_idx, l_my_room); + return; + } else { + aMR_GetSwitchBit(ftr_actor, placed_flag, l_my_room); + if (ftr_actor->switch_bit) { + aMR_HaniwaSwitchOn(actorx, ftr_actor); + } + + aMR_GetHaniwaStep(ftr_actor, placed_flag, &l_my_room->haniwa_step_idx, l_my_room); + return; + } + } + } else { + if (placed_flag == TRUE) { + ftr_actor->switch_bit = TRUE; + ftr_actor->haniwa_step = -1; + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_TOGGLE) || + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_START_DISABLED)) { + ftr_actor->switch_bit = FALSE; + } + } else { + aMR_GetSwitchBit(ftr_actor, placed_flag, my_room); + ftr_actor->haniwa_step = -1; + } + + return; + } + + ftr_actor->switch_bit = FALSE; + ftr_actor->haniwa_step = 0; +} + +static int aMR_SystemAnimeCt_UniqueCt(FTR_ACTOR* ftr_actor, aFTR_PROFILE* profile) { + if (profile->rig != NULL) { + cKF_SkeletonInfo_R_c* keyframe = &ftr_actor->keyframe; + cKF_Skeleton_R_c* skeleton = profile->rig->skeleton; + cKF_Animation_R_c* animation = profile->rig->animation; + + cKF_SkeletonInfo_R_ct(keyframe, skeleton, animation, ftr_actor->joint, ftr_actor->morph); + cKF_SkeletonInfo_R_init_standard_repeat(keyframe, animation, NULL); + cKF_SkeletonInfo_R_play(keyframe); + + keyframe->frame_control.speed = 0.5f; + } + + if (profile->vtable != NULL && profile->vtable->ct_proc != NULL) { + profile->vtable->ct_proc(ftr_actor, aMR_FtrNo2BankAddress(ftr_actor->name)); + } + + return TRUE; +} + +static int aMR_RegistMoveBg(FTR_ACTOR* ftr_actor, aFTR_PROFILE* profile) { + ftr_actor->move_bg_idx = -1; + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_NO_COLLISION) == FALSE || + mFI_CheckShop() == TRUE || mFI_GetFieldId() == mFI_FIELD_ROOM_BROKER_SHOP) { + f32 height; + + if (aMR_layer_set_info[ftr_actor->name] == aFTR_SET_TYPE_SURFACE) { + height = profile->height; + } else { + height = 100.0f; + } + + ftr_actor->move_bg_idx = + mCoBG_RegistMoveBg(&ftr_actor->bg_register, &ftr_actor->position, &ftr_actor->last_position, + &ftr_actor->s_angle_y, height, NULL, &ftr_actor->collision_scale, &ftr_actor->bg_contact, + &ftr_actor->base_position, profile->move_bg_type, mCoBG_ATTRIBUTE_STONE, 81.0f); + + if (ftr_actor->move_bg_idx != -1) { + return TRUE; + } else { + return FALSE; + } + } else { + return TRUE; + } +} + +static void aMR_MiniDiskCommonCt(FTR_ACTOR* ftr_actor, s16 placed_flag) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + int count; + int i; + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK)) { + if (placed_flag == FALSE) { + if (ftr_actor->switch_bit == TRUE) { + ftr_actor->haniwa_state = 1; + ftr_actor->switch_changed_flag = FALSE; + } + } else { + int home_idx = (mFI_GetFieldId() - mFI_FIELD_PLAYER0_ROOM) & 3; + + count = 0; + for (i = 0; i < MINIDISK_NUM; i++) { + u32* music_box = Save_Get(scene_no) == SCENE_COTTAGE_MY ? Save_Get(island).cottage.music_box + : Save_Get(homes[home_idx]).music_box; + + if (((music_box[(i / 32) & 1] >> (i & 31)) & 1) != 0) { + count++; + } + } + + /* Pick a random song to play when placed */ + if (count > 0) { + int sel = RANDOM(count); + + count = 0; + for (i = 0; i < MINIDISK_NUM; i++) { + u32* music_box = Save_Get(scene_no) == SCENE_COTTAGE_MY ? Save_Get(island).cottage.music_box + : Save_Get(homes[home_idx]).music_box; + + if (((music_box[(i / 32) & 1] >> (i & 31)) & 1) != 0) { + if (sel == count) { + ftr_actor->items[0] = ITM_MINIDISK_START + i; + // @BUG - missing break; + } + + count++; + } + } + } + + ftr_actor->switch_changed_flag = FALSE; + ftr_actor->switch_bit = FALSE; + } + } +} + +static void aMR_MiniDiskCommonDt(FTR_ACTOR* ftr_actor, ACTOR* actorx) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK) && + ftr_actor->switch_bit == TRUE) { + mBGMPsComp_delete_ps_room(my_room->bgm_info.md_no, 0); + my_room->bgm_info.active_flag = FALSE; + my_room->bgm_info.active_ftr_actor = NULL; + my_room->bgm_info.last_md_no = -1; + + /* Don't delete for aerobics radio music */ + if (my_room->bgm_info.md_no != 27) { + mBGMPsComp_MDPlayerPos_delete(); + } + } +} + +static void aMR_RadioCommonCt(FTR_ACTOR* ftr_actor, s16 placed_flag) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_RADIO_AEROBICS)) { + ftr_actor->switch_changed_flag = FALSE; + ftr_actor->switch_bit = FALSE; + } +} + +static void aMR_RadioCommonDt(FTR_ACTOR* ftr_actor, ACTOR* actorx) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_RADIO_AEROBICS) && + ftr_actor->switch_bit == TRUE) { + aMR_ReserveDefaultBgm(actorx, ftr_actor); + aMR_ChangeMDBgm(actorx, ftr_actor); + } +} + +static void aMR_ChangeMDBgm(ACTOR* actorx, FTR_ACTOR* ftr_actor) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if ((int)my_room->bgm_info.reserve_flag == TRUE) { + if (my_room->bgm_info.active_flag == FALSE) { + if (my_room->bgm_info.md_no != -1) { + mBGMPsComp_make_ps_room(my_room->bgm_info.md_no, 0); + + if (my_room->bgm_info.md_no != 27) { + mBGMPsComp_MDPlayerPos_make(); + } + + my_room->bgm_info.active_flag = TRUE; + my_room->bgm_info.active_ftr_actor = ftr_actor; + my_room->bgm_info.last_md_no = my_room->bgm_info.md_no; + } + } else if (my_room->bgm_info.md_no == -1) { + mBGMPsComp_delete_ps_room(my_room->bgm_info.last_md_no, 0); + mBGMPsComp_MDPlayerPos_delete(); + my_room->bgm_info.active_flag = FALSE; + my_room->bgm_info.active_ftr_actor = NULL; + my_room->bgm_info.last_md_no = my_room->bgm_info.md_no; + } else { + mBGMPsComp_delete_ps_room(my_room->bgm_info.last_md_no, 0); + if (my_room->bgm_info.last_md_no != 27) { + mBGMPsComp_MDPlayerPos_delete(); + } + + mBGMPsComp_make_ps_room(my_room->bgm_info.md_no, 0); + if (my_room->bgm_info.md_no != 27) { + mBGMPsComp_MDPlayerPos_make(); + } + + my_room->bgm_info.active_flag = TRUE; + my_room->bgm_info.active_ftr_actor = ftr_actor; + my_room->bgm_info.last_md_no = my_room->bgm_info.md_no; + } + + my_room->bgm_info.reserve_flag = FALSE; + my_room->bgm_info.last_md_no = my_room->bgm_info.md_no; + } +} + +static void aMR_ReserveBgm(ACTOR* actorx, int bgm_no, FTR_ACTOR* ftr_actor, s16 timer) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->bgm_info.reserve_flag = TRUE; + my_room->bgm_info.timer = timer; + my_room->bgm_info.md_no = bgm_no; + my_room->bgm_info.reserved_ftr_actor = ftr_actor; +} + +static void aMR_ReserveDefaultBgm(ACTOR* actorx, FTR_ACTOR* ftr_actor) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->bgm_info.reserve_flag = TRUE; + my_room->bgm_info.timer = 0; + my_room->bgm_info.md_no = -1; + my_room->bgm_info.reserved_ftr_actor = ftr_actor; +} + +static void aMR_AllMDSwitchOff(void) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK) || + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_RADIO_AEROBICS)) { + ftr_actor->switch_bit = FALSE; + ftr_actor->switch_changed_flag = TRUE; + } + } + + used++; + ftr_actor++; + } +} + +static void aMR_OneMDSwitchOn_TheOtherSwitchOff(FTR_ACTOR* ftr_actor) { + aMR_AllMDSwitchOff(); + ftr_actor->switch_bit = TRUE; + ftr_actor->switch_changed_flag = TRUE; +} + +// Part 2 + +static void aMR_Status2MoveBgCollisionScale(FTR_ACTOR* ftr_actor, s16 status) { + if (status == aFTR_STATE_BIRTH_WAIT) { + ftr_actor->collision_scale = 0.6f; + } else { + ftr_actor->collision_scale = 1.0f; + } +} + +static void aMR_FurnitureCt(FTR_ACTOR* ftr_actor, GAME* game, int ut_x, int ut_z, mActor_name_t item, int ftr_idx, + s16 status, s16 layer, s16 placed_flag) { + int angle = FTR_GET_ROTATION(item); + static xyz_t xyz0 = { 0.0f, 0.0f, 0.0f }; + aFTR_PROFILE* profile; + xyz_t pos; + + bzero(ftr_actor, sizeof(FTR_ACTOR)); + ftr_actor->ctr_type = aFTR_CTR_TYPE_GAME_PLAY; + ftr_actor->base_position = xyz0; + ftr_actor->layer = layer; + ftr_actor->angle_y = aMR_angle_table[angle]; + ftr_actor->angle_y_target = ftr_actor->angle_y; + ftr_actor->s_angle_y = RAD2SHORT_ANGLE2(DEG2RAD(ftr_actor->angle_y)); + ftr_actor->name = mRmTp_FtrItemNo2FtrIdx(item); + + profile = aMR_GetFurnitureProfile(ftr_actor->name); + ftr_actor->state = status; + aMR_SetFurnitureType(ftr_actor, angle); + aMR_SetFirstScale(ftr_actor); + aMR_UnitNumber2Position(&pos, ftr_actor->shape_type, ut_x, ut_z); + pos.y = mCoBG_GetBgY_AngleS_FromWpos(NULL, pos, 0.0f); + ftr_actor->position = pos; + ftr_actor->last_position = pos; + ftr_actor->id = ftr_idx; + aMR_SetInfoFurnitureTable(ftr_actor->shape_type, ut_x + ut_z * UT_X_NUM, ftr_idx, ftr_actor->layer); + ftr_actor->collision_direction = 0; + + if (aMR_CLIP != NULL && aMR_CLIP->my_room_actor_p != NULL) { + aMR_SetSwitchStepData(ftr_actor, placed_flag, (MY_ROOM_ACTOR*)aMR_CLIP->my_room_actor_p); + } + + aMR_MiniDiskCommonCt(ftr_actor, placed_flag); + aMR_RadioCommonCt(ftr_actor, placed_flag); + aMR_Status2MoveBgCollisionScale(ftr_actor, status); + if (aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_HANIWA)) { + ftr_actor->dynamic_work_s[3] = placed_flag; + } + + if (aMR_RegistMoveBg(ftr_actor, profile) && aMR_SystemAnimeCt_UniqueCt(ftr_actor, profile)) { + aMR_SetFurniture2FG(ftr_actor, ftr_actor->position, TRUE); + } +} + +static int aMR_DmaFurniture_Common(u16 ftr_id, mActor_name_t item, u8* bank_addr, int bank_idx) { + if (bank_addr != NULL) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_id); + + if (bank_idx != -1) { + l_bank_index_table[ftr_id] = bank_idx; + } + + if (profile->vtable != NULL && profile->vtable->dma_proc != NULL) { + profile->vtable->dma_proc(item, aMR_FtrNo2BankAddress(ftr_id)); + return TRUE; + } else { + return TRUE; + } + } + + return FALSE; +} + +static int aMR_GetFurnitureBank(u16 ftr_id, GAME_PLAY* play, mActor_name_t item) { + if (aMR_SearchFurnitureBankVacancy()) { + int bank_idx = aMR_SearchFreeFurnitureBankIdx(); + + if (bank_idx != -1) { + u8* bank_addr = aMR_BankNo2BankAddress(bank_idx); + + return aMR_DmaFurniture_Common(ftr_id, item, bank_addr, bank_idx); + } + } + + return FALSE; +} + +static int aMR_GetFurnitureBank2(u16 ftr_id, GAME* game, mActor_name_t item) { + GAME_PLAY* play = (GAME_PLAY*)game; + + if (aMR_CheckFurnitureBankExist(ftr_id)) { + return TRUE; + } + + if (aMR_GetFurnitureBank(ftr_id, play, item)) { + return TRUE; + } + + return FALSE; +} + +static void aMR_MakeOneFurniture(ACTOR* actorx, mActor_name_t item, GAME* game, int ut_x, int ut_z, s16 layer) { + if (ITEM_IS_FTR(item) && aMR_CountFurniture() < l_aMR_work.list_size) { + u16 ftr_idx = mRmTp_FtrItemNo2FtrIdx((mActor_name_t)item); + int id = aMR_SearchFreeFurnitureActorNumber(); + + if (id != -1) { + u8* used = l_aMR_work.used_list; + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list + id; + + if (aMR_GetFurnitureBank2(ftr_idx, game, item)) { + used[id] = TRUE; + aMR_FurnitureCt(ftr_actor, game, ut_x, ut_z, item, id, aFTR_STATE_STOP, layer, FALSE); + aMR_PlussWeight(actorx, ftr_actor); + } + } + } +} + +static void aMR_MakeFurnitureActor(ACTOR* actorx, GAME_PLAY* play, s16 layer) { + GAME* game = (GAME*)play; + mActor_name_t* fg_p = aMR_GetLayerTopFg(layer); + int ut_x; + int ut_z; + + if (fg_p != NULL) { + for (ut_z = 0; ut_z < UT_Z_NUM; ut_z++) { + for (ut_x = 0; ut_x < UT_X_NUM; ut_x++) { + aMR_MakeOneFurniture(actorx, *fg_p, game, ut_x, ut_z, layer); + fg_p++; + } + } + } +} + +static void aMR_InitFurnitureActorExistTable(void) { + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + l_aMR_work.used_list[i] = FALSE; + } +} + +static void aMR_InitFurnitureBankTable(void) { + int i; + + for (i = 0; i < FTR_NUM; i++) { + l_bank_index_table[i] = 255; + } +} + +extern cKF_Skeleton_R_c cKF_bs_r_furniture_stop; +extern cKF_Animation_R_c cKF_ba_r_furniture_stop; + +static void aMR_InitDummyKeyAnime(GAME_PLAY* play, ACTOR* actorx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + cKF_SkeletonInfo_R_ct(&my_room->keyframe, &cKF_bs_r_furniture_stop, &cKF_ba_r_furniture_stop, my_room->joint, + my_room->morph); +} + +static void aMR_GetBankSitu(int* unalloc_bank_num, int* alloc_bank_num, int* req_bank_num) { + *unalloc_bank_num = 0; + *alloc_bank_num = 0; + + if (*req_bank_num > aMR_FTR_BANK_NUM) { + *req_bank_num = aMR_FTR_BANK_NUM; + } + + *unalloc_bank_num = *req_bank_num <= aMR_FTR_BANK_NUM ? *req_bank_num : aMR_FTR_BANK_NUM; + if (*req_bank_num > *unalloc_bank_num) { + *alloc_bank_num = *req_bank_num - *unalloc_bank_num; + } +} + +static void aMR_SecureFurnitureBank(MY_ROOM_ACTOR* my_room, GAME* game) { + u8* bank_p; + size_t size; + int i; + + aMR_GetBankSitu(&my_room->bank_count0, &my_room->bank_count1, &l_aMR_work.list_size); + size = my_room->bank_count0 * aMR_FTR_BANK_SIZE; + + for (i = 0; i < aMR_FTR_BANK_NUM; i++) { + l_bank_address_table[i] = NULL; + } + + bank_p = (u8*)zelda_malloc_align(size, 32); + my_room->bank0_p = bank_p; + for (i = 0; i < my_room->bank_count0; i++) { + l_bank_address_table[i] = bank_p + i * aMR_FTR_BANK_SIZE; + } + + if (my_room->bank_count1 > 0) { + for (i = 0; i < my_room->bank_count1; i++) { + u8* bank = (u8*)zelda_malloc(aMR_FTR_BANK_SIZE); + int idx = my_room->bank_count0 + i; + + if (bank != NULL) { + l_bank_address_table[idx] = bank; + } + } + } +} + +static int aMR_GetSceneFurnitureMax(void) { + static int scene_table[] = { + SCENE_NPC_HOUSE, + SCENE_FIELD_TOOL_INSIDE, + SCENE_SHOP0, + SCENE_CONVENI, + SCENE_SUPER, + SCENE_DEPART, + SCENE_DEPART_2, + SCENE_BROKER_SHOP, + SCENE_MY_ROOM_S, + SCENE_MY_ROOM_M, + SCENE_MY_ROOM_L, + SCENE_KAMAKURA, + SCENE_MUSEUM_ROOM_PAINTING, + SCENE_MUSEUM_ROOM_FOSSIL, + SCENE_MY_ROOM_LL1, + SCENE_MY_ROOM_LL2, + SCENE_MY_ROOM_BASEMENT_S, + SCENE_MY_ROOM_BASEMENT_M, + SCENE_MY_ROOM_BASEMENT_L, + SCENE_MY_ROOM_BASEMENT_LL1, + SCENE_COTTAGE_MY, + SCENE_COTTAGE_NPC, + -1, + }; + + static int bank_count_table[] = { + 30, 30, 10, 10, 10, 10, 10, 10, 32, 48, 64, 10, 20, 25, 64, 48, 64, 64, 64, 64, 64, 30, 5, + }; + + int scene = Save_Get(scene_no); + int i; + + for (i = 0; scene_table[i] != -1; i++) { + if (scene == scene_table[i]) { + return bank_count_table[i]; + } + } + + return 3; +} + +static void aMR_SecureFurnitureRam(ACTOR* actorx) { + l_aMR_work.ftr_actor_list = (FTR_ACTOR*)zelda_malloc(l_aMR_work.list_size * sizeof(FTR_ACTOR)); + l_aMR_work.used_list = (u8*)zelda_malloc(l_aMR_work.list_size * sizeof(u8)); + + if (l_aMR_work.ftr_actor_list == NULL || l_aMR_work.used_list == NULL) { + l_aMR_work.list_size = 0; + } +} + +static void aMR_InitFurnitureTable(FTR_ACTOR* ftr_actor, int count) { + if (ftr_actor != NULL) { + int i; + + for (i = 0; i < count; i++) { + bzero(&ftr_actor[i], sizeof(FTR_ACTOR)); + } + } +} + +static int aMR_JudgeBreedNewFurniture(GAME* game, u16 ftr_no, int* ut_x, int* ut_z, u16* rotation, int* square_offset, + int* layer); +static mActor_name_t aMR_SearchPickupFurniture(GAME* game); +static void aMR_Furniture2ItemBag(GAME* game); +static int aMR_JudgePlayerAction(xyz_t* wpos0, xyz_t* wpos1, int ftr_actor_idx); +static void aMR_PlayerMoveFurniture(int ftr_actor_idx, xyz_t* wpos); +static int aMR_ftrID2Wpos(xyz_t* wpos, int ftr_id); +static int aMR_UnitNum2FtrItemNoFtrID(mActor_name_t* ftr_item_no, int* ftr_id, int ut_x, int ut_z, int layer); +static void aMR_FtrID2ExtinguishFurniture(int ftr_id); +static void aMR_RedmaFtrBank(void); +static int aMR_ReserveFurniture(GAME* game, u16 ftr_no, int judge_res, int ut_x, int ut_z, u16 rotation, + int square_offset, int layer); +static int aMR_CountFriendFurniture(FTR_ACTOR* ftr_actor, u8 switch_on); +static int aMR_JudgePlace2ndLayer(int ut_x, int ut_z); +static void aMR_OpenCloseCommonMove(FTR_ACTOR* ftr_actor, ACTOR* actor, GAME* game, f32 start_frame, f32 end_frame); +static int aMR_GetBedAction(ACTOR* actorx, int bed_move_dir); +static void aMR_MiniDiskCommonMove(FTR_ACTOR* ftr_actor, ACTOR* my_room_actorx, GAME* game, f32 start_frame, + f32 end_frame); +static void aMR_FamicomEmuCommonMove(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, GAME* game, int rom_no, + int agb_rom_no); +static int aMR_SetLeaf(const xyz_t* pos, f32 scale); +static int aMR_Ftr2Leaf(void); +static void aMR_LeafStartPos(xyz_t* pos); +static int aMR_PickupFtrLayer(void); +static void aMR_LeafPickuped(void); +static u8* aMR_FtrNo2BankAddress(u16 ftr_no); +static void aMR_CallSitDownOngenPosSE(const xyz_t* pos); +static void aMR_SoundMelody(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, int idx); +static int aMR_CheckDannaKill(xyz_t* pos); + +static void aMR_SetClip(ACTOR* actorx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->clip.my_room_actor_p = actorx; + my_room->clip.judge_breed_new_ftr_proc = &aMR_JudgeBreedNewFurniture; + my_room->clip.search_pickup_ftr_proc = &aMR_SearchPickupFurniture; + my_room->clip.ftr2itemBag_proc = &aMR_Furniture2ItemBag; + my_room->clip.judge_player_action_proc = &aMR_JudgePlayerAction; + my_room->clip.player_move_ftr_proc = &aMR_PlayerMoveFurniture; + my_room->clip.ftrId2wpos_proc = &aMR_ftrID2Wpos; + my_room->clip.unitNum2ftrItemNoftrId_proc = &aMR_UnitNum2FtrItemNoFtrID; + my_room->clip.ftrId2extinguishFtr_proc = &aMR_FtrID2ExtinguishFurniture; + my_room->clip.redma_ftr_bank_proc = &aMR_RedmaFtrBank; + my_room->clip.reserve_ftr_proc = &aMR_ReserveFurniture; + my_room->clip.count_friend_ftr_proc = &aMR_CountFriendFurniture; + my_room->clip.judge_place_2nd_layer_proc = &aMR_JudgePlace2ndLayer; + my_room->clip.open_close_common_move_proc = &aMR_OpenCloseCommonMove; + my_room->clip.get_bed_action_proc = &aMR_GetBedAction; + my_room->clip.mini_disk_common_move_proc = &aMR_MiniDiskCommonMove; + my_room->clip.famicom_emu_common_move_proc = &aMR_FamicomEmuCommonMove; + my_room->clip.set_leaf_proc = &aMR_SetLeaf; + my_room->clip.ftr2leaf_proc = &aMR_Ftr2Leaf; + my_room->clip.leaf_start_pos_proc = &aMR_LeafStartPos; + my_room->clip.pickup_ftr_layer_proc = &aMR_PickupFtrLayer; + my_room->clip.leaf_pickuped_proc = &aMR_LeafPickuped; + my_room->clip.ftrNo2bankAddress_proc = &aMR_FtrNo2BankAddress; + my_room->clip.call_sit_down_ongen_pos_se_proc = &aMR_CallSitDownOngenPosSE; + my_room->clip.clock_info_p = &my_room->clock_info; + my_room->clip.sound_melody_proc = &aMR_SoundMelody; + my_room->clip.check_danna_kill_proc = &aMR_CheckDannaKill; + + aMR_CLIP = &my_room->clip; +} + +static void aMR_MakeItemDataInFurniture(void) { + mActor_name_t* layer_top_table[mCoBG_LAYER_NUM]; + int idx; + int j; + int ut_x; + int ut_z; + int i; + int k; + + for (k = 0; k < mCoBG_LAYER_NUM; k++) { + layer_top_table[k] = aMR_GetLayerTopFg(k); + } + + for (i = mCoBG_LAYER0; i < mCoBG_LAYER2; i++) { + if (layer_top_table[i] != NULL) { + idx = 0; + + for (j = i + 1; j < mCoBG_LAYER_NUM; j++) { + mActor_name_t* fg_top_p = layer_top_table[j]; + + if (fg_top_p != NULL) { + for (ut_z = 0; ut_z < UT_Z_NUM; ut_z++) { + for (ut_x = 0; ut_x < UT_X_NUM; ut_x++) { + if (*fg_top_p != EMPTY_NO && *fg_top_p != RSV_NO && *fg_top_p != RSV_WALL_NO) { + mActor_name_t item; + int ftr_id; + + if (aMR_UnitNum2FtrItemNoFtrID(&item, &ftr_id, ut_x, ut_z, i)) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list + ftr_id; + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (aFTR_IS_STORAGE(profile)) { + ftr_actor->items[idx] = *fg_top_p; + *fg_top_p = EMPTY_NO; + } + } + } + + fg_top_p++; + } + } + } + + idx++; + } + } + } +} + +static void aMR_ClearSwitchSaveData(MY_ROOM_ACTOR* my_room) { + u64* switch_bit_table[2]; + int i; + + for (i = mCoBG_LAYER0; i < mCoBG_LAYER2; i++) { + switch_bit_table[i] = aMR_GetBitSwitchTable(i, my_room); + + if (switch_bit_table[i] != NULL) { + *switch_bit_table[i] = 0; + } + } +} + +static TempoBeat_c* aMR_NowSceneWaltzTempo(MY_ROOM_ACTOR* my_room) { + mActor_name_t field_id = mFI_GetFieldId(); + + if (my_room->scene == SCENE_COTTAGE_MY) { + return &Save_Get(island).cottage.room.tempo_beat; + } else if (mFI_GET_TYPE(field_id) == mFI_FIELD_PLAYER0_ROOM) { + int idx = (mFI_GetFieldId() - mFI_FIELD_PLAYER0_ROOM) & 3; + int floor_no = mFI_GetPlayerHouseFloorNo(my_room->scene); + + if (floor_no != -1) { + return &Save_Get(homes[idx]).floors[floor_no].tempo_beat; + } + } + + return NULL; +} + +static void aMR_GetSavedWaltzTempo(MY_ROOM_ACTOR* my_room) { + sAdo_SetRhythmInfo(aMR_NowSceneWaltzTempo(my_room)); +} + +static void aMR_SaveWaltzTempo(MY_ROOM_ACTOR* my_room) { + TempoBeat_c* rhythm = aMR_NowSceneWaltzTempo(my_room); + + if (rhythm != NULL && Common_Get(rhythym_updated) == FALSE) { + sAdo_GetRhythmInfo(rhythm); + Common_Set(rhythym_updated, TRUE); + } +} + +extern void aMR_SaveWaltzTempo2(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + aMR_SaveWaltzTempo(my_room); + aMR_SaveHaniwaStepData(my_room); + } + } +} + +static int aMR_CheckRoomOwner(u32 player_no, MY_ROOM_ACTOR* my_room) { + if (Common_Get(field_type) == mFI_FIELDTYPE2_PLAYER_ROOM || my_room->scene == SCENE_COTTAGE_MY) { + return TRUE; + } + + return FALSE; +} + +static void aMR_MakeRoomInfo(MY_ROOM_ACTOR* my_room) { + u32 player_no = Common_Get(player_no); + + my_room->room_info.shop_flag = FALSE; + my_room->room_info.owner_flag = FALSE; + + if (mFI_CheckShop() == TRUE || mFI_GetFieldId() == mFI_FIELD_ROOM_BROKER_SHOP) { + my_room->room_info.shop_flag = TRUE; + } + + if (aMR_CheckRoomOwner(player_no, my_room)) { + my_room->room_info.owner_flag = TRUE; + } +} + +static void aMR_OneMDFurnitureSwitchOn(void) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (profile != NULL && + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK) && + !(ftr_actor->items[0] >= ITM_MINIDISK_START && ftr_actor->items[0] < ITM_MINIDISK_END)) { + ftr_actor->switch_bit = FALSE; + ftr_actor->switch_changed_flag = FALSE; + ftr_actor->haniwa_state = 0; + } + } + + ftr_actor++; + used++; + } +} + +static void aMR_InitFurnitureWork(void) { + int i; + + for (i = mCoBG_LAYER0; i < mCoBG_LAYER2; i++) { + u8* place_p = aMR_place_table[i & 1]; + int j; + + for (j = 0; j < UT_TOTAL_NUM; j++) { + if (*place_p != 201 && *place_p != 200) { + *place_p = 200; + } + + place_p++; + } + } +} + +static void aMR_DeleteMusicWhichMusicBoxDontHave(void) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + + if (mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_PLAYER0_ROOM) { + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used == TRUE) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (profile != NULL && + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK) && + (ftr_actor->items[0] >= ITM_MINIDISK_START && ftr_actor->items[0] < ITM_MINIDISK_END)) { + int idx = (mFI_GetFieldId() - mFI_FIELD_PLAYER0_ROOM) & 3; + int music_idx = (mActor_name_t)(ftr_actor->items[0] - ITM_MINIDISK_START); + u32* music_box = Save_Get(scene_no) == SCENE_COTTAGE_MY ? Save_Get(island).cottage.music_box + : Save_Get(homes[idx]).music_box; + + if (((music_box[(music_idx / 32) & 1] >> (music_idx & 31)) & 1) == 0) { + ftr_actor->items[0] = EMPTY_NO; + + if (ftr_actor->switch_bit == TRUE) { + ftr_actor->switch_bit = FALSE; + ftr_actor->haniwa_state = 0; + } + } + } + } + + ftr_actor++; + used++; + } + } +} + +static void aMR_SetMDIslandNPC(void) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + int md_set = FALSE; + + if (Save_Get(scene_no) == SCENE_COTTAGE_NPC) { + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (profile != NULL && + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_MUSIC_DISK)) { + if (md_set == FALSE) { + ftr_actor->items[0] = ITM_MINIDISK_START + mNpc_GetIslandMDIdx(); + ftr_actor->switch_bit = TRUE; + ftr_actor->haniwa_state = 1; + md_set = TRUE; + } else { + ftr_actor->switch_bit = FALSE; + ftr_actor->haniwa_state = 0; + } + } + } + + ftr_actor++; + used++; + } + } +} + +static void aMR_GokiInfoCt(ACTOR* actorx, GAME* game); + +static void My_Room_Actor_ct(ACTOR* actorx, GAME* game) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + + bzero(&l_aMR_work, sizeof(l_aMR_work)); + my_room->scene = Save_Get(scene_no); + aMR_SetClip(actorx); + aMR_InitFurnitureWork(); + aMR_SetMelodyData(my_room->melody); + my_room->goki_ct_proc = &aMR_GokiInfoCt; + aMR_MakeRoomInfo(my_room); + aMR_GetSavedWaltzTempo(my_room); + l_aMR_work.list_size = aMR_GetSceneFurnitureMax(); + aMR_SecureFurnitureRam(actorx); + aMR_InitFurnitureTable(l_aMR_work.ftr_actor_list, l_aMR_work.list_size); + aMR_InitFurnitureActorExistTable(); + aMR_SecureFurnitureBank(my_room, game); + aMR_InitHaniwaOnTable(actorx); + my_room->state = 0; + aMR_InitFurnitureBankTable(); + aMR_MakeFurnitureActor(actorx, play, mCoBG_LAYER0); + aMR_MakeFurnitureActor(actorx, play, mCoBG_LAYER1); + my_room->parent_ftrID = -1; + Common_Set(make_npc2_actor, TRUE); + aMR_MakeItemDataInFurniture(); + aMR_DeleteMusicWhichMusicBoxDontHave(); + aMR_InitDummyKeyAnime(play, actorx); + my_room->allow_rotation_flag = TRUE; + my_room->sit_timer = 0; + my_room->bed_timer = 0; + my_room->msg_type = 0; + my_room->requested_msg_type = my_room->msg_type; + my_room->bgm_info.reserve_flag = FALSE; + my_room->bgm_info.md_no = -1; + my_room->bgm_info.last_md_no = -1; + aMR_ClearSwitchSaveData(my_room); + aMR_OneMDFurnitureSwitchOn(); + aMR_SetMDIslandNPC(); + my_room->emu_info.request_flag = FALSE; + my_room->emu_info.explaination_given_flag = FALSE; + mCkRh_InitCanLookGokiCount(); +} + +// Part 3 + +static void aMR_FreeMallocBank(ACTOR* actorx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + int i; + + if (my_room->bank_count1 != 0) { + for (i = 0; i < my_room->bank_count1; i++) { + zelda_free(l_bank_address_table[my_room->bank_count0 + i]); + } + } +} + +static void aMR_FreeHeapArea(ACTOR* actorx) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if (l_aMR_work.ftr_actor_list != NULL) { + zelda_free(l_aMR_work.ftr_actor_list); + } + + if (l_aMR_work.used_list != NULL) { + zelda_free(l_aMR_work.used_list); + } + + aMR_FreeMallocBank(actorx); + + if (my_room->emu_info.famicom_names_p != NULL) { + zelda_free(my_room->emu_info.famicom_names_p); + } + + if (my_room->bank0_p != NULL) { + zelda_free(my_room->bank0_p); + } +} + +static void aMR_KeepItem2Fg(FTR_ACTOR* ftr_actor) { + int idx = 0; + int i; + + for (i = ftr_actor->layer + 1; i < mCoBG_LAYER_NUM; i++) { + if (ftr_actor->items[idx] != EMPTY_NO) { + mActor_name_t* fg_p = aMR_GetLayerTopFg(i); + + if (fg_p != NULL) { + int ut_x; + int ut_z; + + if (aMR_Wpos2PlaceNumber(&ut_x, &ut_z, ftr_actor->position, ftr_actor->shape_type)) { + fg_p[ut_x + ut_z * UT_X_NUM] = ftr_actor->items[idx]; + ftr_actor->items[idx] = EMPTY_NO; + } + } + } + + idx++; + } +} + +static void aMR_AllFurnitureDestruct(ACTOR* actorx, GAME* game) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + + sAdo_RhythmAllStop(); + if (ftr_actor != NULL && used != NULL) { + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used) { + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + mCoBG_CrossOffMoveBg(ftr_actor->move_bg_idx); + aMR_KeepItem2Fg(ftr_actor); + aMR_MiniDiskCommonDt(ftr_actor, actorx); + aMR_RadioCommonDt(ftr_actor, actorx); + aMR_MinusWeight(actorx, ftr_actor); + + if (profile != NULL && profile->vtable != NULL && profile->vtable->dt_proc != NULL) { + profile->vtable->dt_proc(ftr_actor, aMR_FtrNo2BankAddress(ftr_actor->name)); + } + + *used = FALSE; + } + + used++; + ftr_actor++; + } + } +} + +static void aMR_LeafPickuped(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->pickup_info.pickup_flag = FALSE; + } + } +} + +static int aMR_PickupFtrLayer(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + return my_room->pickup_info.layer; + } + } + + return mCoBG_LAYER0; +} + +static void aMR_LeafStartPos(xyz_t* pos) { + static xyz_t leaf_start0 = { 0.0f, 0.0f, 0.0f }; + + *pos = leaf_start0; + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + *pos = my_room->pickup_info.leaf_pos; + } + } +} + +static int aMR_Ftr2Leaf(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + return my_room->pickup_info.picking_up_flag; + } + } + + return FALSE; +} + +static int aMR_SetLeaf(const xyz_t* pos, f32 scale) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if (my_room->leaf_info.exist_flag == FALSE) { + my_room->leaf_info.pos = *pos; + my_room->leaf_info.scale = scale; + my_room->leaf_info.exist_flag = TRUE; + return TRUE; + } + + return FALSE; + } + } + + return FALSE; +} + +static void My_Room_Actor_dt(ACTOR* actorx, GAME* game) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + aMR_SaveSwitchData(my_room); + aMR_AllFurnitureDestruct(actorx, game); + aMR_FreeHeapArea(actorx); + aMR_GokiInfoDt(); + aMR_CLIP = NULL; + mCkRh_SetGoingOutCottageTime(my_room->scene); + + /* TODO: enums for this field */ + if ((Common_Get(my_room_message_control_flags) >> 3) & 1) { + Common_Set(my_room_message_control_flags, 0); + Common_Get(my_room_message_control_flags) &= ~2; + Common_Get(my_room_message_control_flags) &= ~1; + Common_Get(my_room_message_control_flags) |= 8; + sAdo_SubGameStart(); + } else if ((Common_Get(my_room_message_control_flags) & 0x10)) { + Common_Set(my_room_message_control_flags, 0); + Common_Get(my_room_message_control_flags) &= ~2; + Common_Get(my_room_message_control_flags) &= ~1; + Common_Get(my_room_message_control_flags) |= 0x10; + sAdo_SubGameStart(); + } else { + Common_Set(my_room_message_control_flags, 0); + Common_Get(my_room_message_control_flags) &= ~2; + Common_Get(my_room_message_control_flags) &= ~1; + } +} + +static void aMR_RedmaFtrBank(void) { + int i; + + for (i = 0; i < FTR_NUM; i++) { + if (l_bank_index_table[i] != 255) { + u8* bank_addr = aMR_BankNo2BankAddress(l_bank_index_table[i]); + mActor_name_t item = mRmTp_FtrIdx2FtrItemNo(i, mRmTp_DIRECT_SOUTH); + + aMR_DmaFurniture_Common(i, item, bank_addr, -1); + } + } +} + +static void aMR_RequestStartEmu(MY_ROOM_ACTOR* my_room, FTR_ACTOR* ftr_actor, int game_idx, int agb_game_idx) { + if (my_room->emu_info.request_flag == FALSE && mMsg_Check_MainHide(mMsg_Get_base_window_p())) { + my_room->emu_info.request_flag = TRUE; + my_room->emu_info.rom_no = game_idx; + my_room->emu_info.agb_rom_no = agb_game_idx; + my_room->emu_info.explaination_given_flag = FALSE; + my_room->emu_info._10 = 0; + my_room->requested_msg_type = aMR_MSG_STATE_QQQ_EMULATOR; + my_room->emu_ftrID = ftr_actor->id; + } +} + +static void aMR_RequestStartEmu_MemoryC(MY_ROOM_ACTOR* my_room, FTR_ACTOR* ftr_actor, int game_idx) { + if (my_room->emu_info.request_flag == FALSE && mMsg_Check_MainHide(mMsg_Get_base_window_p())) { + int card_count = aMR_GetCardFamicomCount(); + + my_room->emu_info.card_famicom_count = card_count; + my_room->emu_info.memory_game_select = 0; + + if (card_count > 0) { + size_t namebuf_size = card_count * mIN_ITEM_NAME_LEN; + + if (my_room->emu_info.famicom_names_p != NULL) { + zelda_free(my_room->emu_info.famicom_names_p); + } + + my_room->emu_info.famicom_names_p = (char*)zelda_malloc(namebuf_size); + + if (my_room->emu_info.famicom_names_p != NULL) { + int n_games = 0; + + if (famicom_get_disksystem_titles(&n_games, my_room->emu_info.famicom_names_p, namebuf_size) == FALSE) { + my_room->requested_msg_type = aMR_MSG_STATE_NO_PACK_NO_DATA; + my_room->room_msg_flag = TRUE; + return; + } + } + + if (card_count == 1) { + my_room->emu_info.request_flag = TRUE; + my_room->emu_info.rom_no = game_idx; + my_room->emu_info.explaination_given_flag = FALSE; + my_room->requested_msg_type = aMR_MSG_STATE_QQQ_EMULATOR_MEMORY1; + my_room->emu_ftrID = ftr_actor->id; + my_room->emu_info._10 = 0; + } else if (card_count == 2) { + my_room->emu_info.request_flag = TRUE; + my_room->emu_info.rom_no = game_idx; + my_room->emu_info.explaination_given_flag = FALSE; + my_room->requested_msg_type = aMR_MSG_STATE_QQQ_EMULATOR_MEMORY2; + my_room->emu_ftrID = ftr_actor->id; + my_room->emu_info._10 = 0; + } else { + my_room->emu_info.request_flag = TRUE; + my_room->emu_info.rom_no = game_idx; + my_room->emu_info.explaination_given_flag = FALSE; + my_room->requested_msg_type = aMR_MSG_STATE_QQQ_EMULATOR_MEMORY_OVER3; + my_room->emu_ftrID = ftr_actor->id; + my_room->emu_info._10 = 0; + } + } else { + my_room->requested_msg_type = aMR_MSG_STATE_NO_PACK_NO_DATA; + my_room->room_msg_flag = TRUE; + } + } +} + +static void aMR_FamicomEmuCommonMove(FTR_ACTOR* ftr_actor, ACTOR* actorx, GAME* game, int rom_no, int agb_rom_no) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if (ftr_actor->switch_changed_flag) { + if (rom_no == 0) { + aMR_RequestStartEmu_MemoryC(my_room, ftr_actor, 0); + } else { + aMR_RequestStartEmu(my_room, ftr_actor, rom_no, agb_rom_no); + } + } +} + +static void aMR_CallSitDownOngenPosSE(const xyz_t* pos) { + mActor_name_t item_no; + int ftrID; + xyz_t sit_pos = *pos; + int ut_x = 0; + int ut_z = 0; + + sit_pos.y = 0.0f; + sit_pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos(sit_pos, 0.0f); + if (mFI_Wpos2UtNum(&ut_x, &ut_z, sit_pos) && + aMR_UnitNum2FtrItemNoFtrID(&item_no, &ftrID, ut_x, ut_z, mCoBG_LAYER0)) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list + ftrID; + + /* Check for massage chair */ + switch (ftr_actor->name) { + case 0x152: + sAdo_OngenPos((u32)ftr_actor, 39, &ftr_actor->position); + break; + } + } +} + +static int aMR_CheckDannaKill(xyz_t* pos) { + mActor_name_t* fg_p = mFI_GetUnitFG(*pos); + + /* @BUG - this doesn't check for newer furniture in the 0x3XXX range */ + if (fg_p != NULL && ((*fg_p >= FTR0_START && *fg_p <= ITEM1_NO_START) || *fg_p == RSV_FE1F)) { + int ut_x; + int ut_z; + + if (mFI_Wpos2UtNum(&ut_x, &ut_z, *pos) && aMR_CLIP != NULL) { + mActor_name_t item_no; + int ftrID; + + if (aMR_UnitNum2FtrItemNoFtrID(&item_no, &ftrID, ut_x & 0xF, ut_z & 0xF, mCoBG_LAYER0)) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list + ftrID; + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_actor->name); + + if (profile != NULL && + aFTR_CHECK_INTERACTION(profile->interaction_type, aFTR_INTERACTION_TYPE_NO_COLLISION) == FALSE && + aMR_CheckFtrAndGoki2(ftr_actor->edge_collision, pos)) { + return TRUE; + } + } + } + } + + return FALSE; +} + +extern int aMR_GetFurnitureUnit(mActor_name_t item) { + if (ITEM_IS_FTR(item)) { + int ftr_idx = mRmTp_FtrItemNo2FtrIdx(item); + aFTR_PROFILE* profile = aMR_GetFurnitureProfile(ftr_idx); + + if (profile != NULL) { + switch (profile->shape) { + case aFTR_SHAPE_TYPEA: + return 0; + case aFTR_SHAPE_TYPEC: + return 2; + default: + return 1; + } + } + } + + return -1; +} + +extern int aMR_CorrespondFurniture(mActor_name_t ftr0, mActor_name_t ftr1) { + if (ITEM_IS_FTR(ftr0) && ITEM_IS_FTR(ftr1)) { + int ftr_idx0 = mRmTp_FtrItemNo2FtrIdx(ftr0); + int ftr_idx1 = mRmTp_FtrItemNo2FtrIdx(ftr1); + + if (ftr_idx0 == ftr_idx1) { + return TRUE; + } + } + + return FALSE; +} + +extern mActor_name_t aMR_FurnitureFg_to_FurnitureFgWithDirect(mActor_name_t item, int direct) { + if (ITEM_IS_FTR(item)) { + return mRmTp_FtrIdx2FtrItemNo(mRmTp_FtrItemNo2FtrIdx(item), direct); + } + + return item; +} + +extern void aMR_RadioCommonMove(FTR_ACTOR* ftr_actor, ACTOR* actorx) { + if (ftr_actor->haniwa_state == 1) { + aMR_ReserveBgm(actorx, 27, ftr_actor, 0); + ftr_actor->haniwa_state = 0; + } else if (ftr_actor->switch_changed_flag) { + if (ftr_actor->switch_bit == FALSE) { + aMR_OneMDSwitchOn_TheOtherSwitchOff(ftr_actor); + aMR_ReserveDefaultBgm(actorx, ftr_actor); + aMR_ChangeMDBgm(actorx, ftr_actor); + ftr_actor->switch_bit = FALSE; + } else { + aMR_OneMDSwitchOn_TheOtherSwitchOff(ftr_actor); + aMR_ReserveBgm(actorx, 27, ftr_actor, 0); + aMR_ChangeMDBgm(actorx, ftr_actor); + ftr_actor->switch_bit = TRUE; + } + } +} + +extern int aMR_RadioBgmNow(void) { + if (mBGMPsComp_execute_bgm_num_get() == 27) { + return TRUE; + } + + return FALSE; +} + +extern aMR_contact_info_c* aMR_GetContactInfoLayer1(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + return &my_room->contact0; + } + } + + return NULL; +} + +extern FTR_ACTOR* aMR_GetParentFactor(FTR_ACTOR* ftr_actor, ACTOR* actorx) { + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + if (my_room->parent_ftrID != -1) { + FTR_ACTOR* parent_ftr_actor = l_aMR_work.ftr_actor_list + my_room->parent_ftrID; + + if (my_room->fit_ftr_table[0].ftr_ID == ftr_actor->id || + my_room->fit_ftr_table[1].ftr_ID == ftr_actor->id || + my_room->fit_ftr_table[2].ftr_ID == ftr_actor->id || + my_room->fit_ftr_table[3].ftr_ID == ftr_actor->id) { + return parent_ftr_actor; + } + } + } + + return NULL; +} + +extern s16 aMR_GetParentAngleOffset(FTR_ACTOR* ftr_actor, ACTOR* actorx) { + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + if (my_room->parent_ftrID != -1) { + FTR_ACTOR* parent_ftr_actor = l_aMR_work.ftr_actor_list + my_room->parent_ftrID; + + if (my_room->fit_ftr_table[0].ftr_ID == ftr_actor->id || + my_room->fit_ftr_table[1].ftr_ID == ftr_actor->id || + my_room->fit_ftr_table[2].ftr_ID == ftr_actor->id || + my_room->fit_ftr_table[3].ftr_ID == ftr_actor->id) { + return parent_ftr_actor->s_angle_y - my_room->parent_angleY; + } + } + } + + return 0; +} + +extern u8 aMR_GetAlphaEdge(u16 ftr_name) { + switch (ftr_name) { + case 0x41: // classic cabinet + case 0x120: // violin + case 0x121: // bass (instrument) + case 0x122: // cello + return 11; + case 0x393: // kitschy clock + case 0x394: // antique clock + return 250; + case 0x3FC: // red balloon + case 0x3FD: // yellow balloon + case 0x3FE: // blue balloon + case 0x3FF: // green balloon + case 0x400: // purple balloon + case 0x401: // bunny p. balloon + case 0x402: // bunny b. balloon + case 0x403: // bunny o. balloon + return 96; + case 0x415: + return 127; // tanabata palm + case 0x4CC: + return 20; // harvest bureau + default: + return 127; + } +} + +extern int aMR_DrawDolphinMode(u16 ftr_name) { + switch (ftr_name) { + case 0x406: // stone coin + case 0x49D: // hamster cage + case 0x4CF: // neutral corner + case 0x4D0: // red corner + case 0x4D1: // blue corner + return TRUE; + default: + return FALSE; + } +} + +extern void aMR_ThrowItem_FurnitureLock(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->throw_item_lock_flag = TRUE; + } + } +} + +extern void aMR_ThrowItem_FurnitureUnlock(void) { + if (aMR_CLIP != NULL) { + ACTOR* actorx = aMR_CLIP->my_room_actor_p; + + if (actorx != NULL) { + MY_ROOM_ACTOR* my_room = (MY_ROOM_ACTOR*)actorx; + + my_room->throw_item_lock_flag = FALSE; + } + } +} + +extern void aMR_SameFurnitureSwitchOFF(u16 ftr_name) { + FTR_ACTOR* ftr_actor = l_aMR_work.ftr_actor_list; + u8* used = l_aMR_work.used_list; + int i; + + for (i = 0; i < l_aMR_work.list_size; i++) { + if (*used && ftr_actor->name == ftr_name) { + ftr_actor->switch_bit = FALSE; + ftr_actor->switch_changed_flag = TRUE; + } + + ftr_actor++; + used++; + } +} diff --git a/src/ac_my_room_data.c_inc b/src/ac_my_room_data.c_inc new file mode 100644 index 00000000..f1c70b22 --- /dev/null +++ b/src/ac_my_room_data.c_inc @@ -0,0 +1,1402 @@ +static xyz_t norm_table[] = { + { 0.0f, 0.0f, -1.0f }, + { -1.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f }, + { 1.0f, 0.0f, 0.0f }, +}; + +typedef struct { + int left; + int right; +} aMR_rotate_data_c; + +static aMR_rotate_data_c rotateDt[] = { + { 1, 3 }, + { 2, 0 }, + { 3, 1 }, + { 0, 2 }, +}; + +typedef struct { + u8 type; + xyz_t offset; +} aMR_type_target_c; + +static aMR_type_target_c type_target_table[] = { + { 2, { 0.0f, 0.0f, -40.0f } }, { 2, { 0.0f, 0.0f, -40.0f } }, { 2, { 0.0f, 0.0f, -40.0f } }, + { 0, { 0.0f, 0.0f, 0.0f } }, { 0, { 0.0f, 0.0f, 0.0f } }, { 0, { 0.0f, 0.0f, 0.0f } }, + { 0, { 0.0f, 0.0f, 0.0f } }, { 2, { 0.0f, 0.0f, -40.0f } }, { 1, { 0.0f, 0.0f, 0.0f } }, + { 3, { -40.0f, 0.0f, 0.0f } }, { 3, { -40.0f, 0.0f, 0.0f } }, { 3, { -40.0f, 0.0f, 0.0f } }, + { 3, { -40.0f, 0.0f, 0.0f } }, { 1, { 0.0f, 0.0f, 0.0f } }, { 1, { 0.0f, 0.0f, 0.0f } }, + { 1, { 0.0f, 0.0f, 0.0f } }, { 2, { 0.0f, 0.0f, 0.0f } }, { 2, { 0.0f, 0.0f, 0.0f } }, + { 2, { 0.0f, 0.0f, 0.0f } }, { 0, { 0.0f, 0.0f, 40.0f } }, { 0, { 0.0f, 0.0f, 40.0f } }, + { 0, { 0.0f, 0.0f, 40.0f } }, { 0, { 0.0f, 0.0f, 40.0f } }, { 2, { 0.0f, 0.0f, 0.0f } }, + { 1, { 40.0f, 0.0f, 0.0f } }, { 3, { 0.0f, 0.0f, 0.0f } }, { 3, { 0.0f, 0.0f, 0.0f } }, + { 3, { 0.0f, 0.0f, 0.0f } }, { 3, { 0.0f, 0.0f, 0.0f } }, { 1, { 40.0f, 0.0f, 0.0f } }, + { 1, { 40.0f, 0.0f, 0.0f } }, { 1, { 40.0f, 0.0f, 0.0f } }, +}; + +static s16 rotate_forbid_table[][2] = { + { -1, 0 }, { -1, -1 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, 0 }, { -1, 0 }, { 1, 0 }, + { 0, 1 }, { -1, 0 }, { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 }, { 0, 1 }, { -1, 0 }, + { 0, -1 }, { 0, 1 }, { 0, 0 }, { -1, 1 }, { 0, -1 }, { 0, 0 }, { 1, 1 }, { 0, 1 }, +}; + +static s16 rotate_forbid_friction_table[][2] = { + { 0x0000, 0x0000 }, { 0x0001, 0x0001 }, { 0x0000, 0x0000 }, { 0x0000, 0x0000 }, { 0x0001, 0xffff }, + { 0x0000, 0x0000 }, { 0x0001, 0x0000 }, { 0x0000, 0x0000 }, { 0x0000, 0xffff }, { 0x0001, 0x0000 }, + { 0x0000, 0x0000 }, { 0x0000, 0x0001 }, { 0x0000, 0x0000 }, { 0xffff, 0xffff }, { 0x0000, 0x0000 }, + { 0x0000, 0x0000 }, { 0xffff, 0x0001 }, { 0x0000, 0x0000 }, { 0xffff, 0x0000 }, { 0x0000, 0x0000 }, + { 0x0000, 0x0001 }, { 0xffff, 0x0000 }, { 0x0000, 0x0000 }, { 0x0000, 0xffff }, +}; + +typedef struct { + s_xyz* ofs_p; + int count; +} aMR_place_info_c; + +static s_xyz l_next_typea[] = { + { 0, 0, -1 }, + { -1, 0, 0 }, + { 0, 0, 1 }, + { 1, 0, 0 }, +}; + +static aMR_place_info_c l_next_place_typeA = { l_next_typea, ARRAY_COUNT(l_next_typea) }; + +static s_xyz l_next_typec[] = { + { 0, 0, -1 }, { -1, 0, 0 }, { -1, 0, 1 }, { 0, 0, 2 }, { 1, 0, 2 }, { 2, 0, 1 }, { 2, 0, 0 }, { 1, 0, -1 }, +}; + +static aMR_place_info_c l_next_place_typeC = { l_next_typec, ARRAY_COUNT(l_next_typec) }; + +static aMR_place_info_c* next_table[] = { + NULL, NULL, NULL, NULL, &l_next_place_typeA, &l_next_place_typeC, +}; + +static xyz_t l_typeB_90_pattern[2] = { + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 40.0f }, +}; + +static xyz_t l_typeB_180_pattern[2] = { + { 0.0f, 0.0f, 0.0f }, + { 40.0f, 0.0f, 0.0f }, +}; + +static xyz_t l_typeB_270_pattern[2] = { + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, -40.0f }, +}; + +static xyz_t l_typeB_0_pattern[2] = { + { 0.0f, 0.0f, 0.0f }, + { -40.0f, 0.0f, 0.0f }, +}; + +static xyz_t* pattern_table[] = { + l_typeB_90_pattern, + l_typeB_180_pattern, + l_typeB_270_pattern, + l_typeB_0_pattern, +}; + +// clang-format off + +/* List of items which are a diary (are a calendar) */ +static u8 aMR_calender_info_table[] = { + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + TRUE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, + FALSE, +}; + +// clang-format on + +typedef struct { + Gfx* mat_gfx; + Gfx* vtx_gfx; +} aMR_icon_display_data_c; + +extern Gfx leaf_DL_mode[]; +extern Gfx leaf_DL_vtx[]; +extern Gfx obj_haniwaT_mat_model[]; +extern Gfx obj_haniwaT_gfx_model[]; +extern Gfx obj_item_clothT_mat_model[]; +extern Gfx obj_item_umbrellaT_mat_model[]; +extern Gfx obj_item_umbrellaT_gfx_model[]; +extern Gfx obj_item_boneT_mat_model[]; +extern Gfx obj_item_boneT_gfx_model[]; +extern Gfx obj_item_diaryT_mat_model[]; +extern Gfx obj_item_diaryT_gfx_model[]; + +static aMR_icon_display_data_c aMR_icon_display_data[] = { + { leaf_DL_mode, leaf_DL_vtx }, + { obj_haniwaT_mat_model, obj_haniwaT_gfx_model }, + { obj_item_clothT_mat_model, obj_item_umbrellaT_gfx_model }, + { obj_item_umbrellaT_mat_model, obj_item_umbrellaT_gfx_model }, + { obj_item_boneT_mat_model, obj_item_boneT_gfx_model }, + { obj_item_diaryT_mat_model, obj_item_diaryT_gfx_model }, +}; diff --git a/src/audio.c b/src/audio.c index ac8e3679..9fe6c6d2 100644 --- a/src/audio.c +++ b/src/audio.c @@ -219,14 +219,13 @@ extern s8 sAdo_GetRhythmDelay(u32 p) { return Na_GetRhythmDelay(p); } -extern f32 sAdo_GetRhythmInfo(u32 p) { +extern void sAdo_GetRhythmInfo(TempoBeat_c* rhythm) { - return Na_GetRhythmInfo(p); + Na_GetRhythmInfo(rhythm); } -extern void sAdo_SetRhythmInfo(f32 p) { - - Na_SetRhythmInfo(p); +extern void sAdo_SetRhythmInfo(TempoBeat_c* rhythm) { + Na_SetRhythmInfo(rhythm); } extern int sAdo_InstCountGet() { diff --git a/src/famicom_emu.c b/src/famicom_emu.c index 63208c87..69a1b030 100644 --- a/src/famicom_emu.c +++ b/src/famicom_emu.c @@ -77,7 +77,7 @@ extern void famicom_emu_main(GAME* famicom) { if (famicom_done == 0) { if (famicom_rom_load_check() < 0) { - Common_Set(famicom_2DBAC, Common_Get(famicom_2DBAC) | 1); + Common_Set(my_room_message_control_flags, Common_Get(my_room_message_control_flags) | 1); famicom_done = 1; famicom_done_countdown = 0; } else { @@ -152,7 +152,7 @@ extern void famicom_emu_init(GAME* game) { my_alloc_init(game, freeXfbBase, freeXfbSize); if (famicom_init(rom_id, &my_malloc_func, player) != 0) { - Common_Set(famicom_2DBAC, Common_Get(famicom_2DBAC) | 1); + Common_Set(my_room_message_control_flags, Common_Get(my_room_message_control_flags) | 1); return_emu_game(game); } } @@ -161,7 +161,7 @@ extern void famicom_emu_cleanup(GAME* game) { JC_JFWDisplay_startFadeIn(JC_JFWDisplay_getManager(), 1); if (famicom_cleanup() != 0) { - Common_Set(famicom_2DBAC, Common_Get(famicom_2DBAC) | 2); + Common_Set(my_room_message_control_flags, Common_Get(my_room_message_control_flags) | 2); } my_alloc_cleanup(); diff --git a/src/ftr/ac_ike_jny_houi01.c b/src/ftr/ac_ike_jny_houi01.c index 634e6f26..41ced0d6 100644 --- a/src/ftr/ac_ike_jny_houi01.c +++ b/src/ftr/ac_ike_jny_houi01.c @@ -57,7 +57,7 @@ static void fIJHOUI_mv(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, GAME* game, u cKF_SkeletonInfo_R_c* keyf = &ftr_actor->keyframe; FTR_ACTOR* parent; - parent = aMR_GetParentFactor(); + parent = aMR_GetParentFactor(ftr_actor, my_room_actor); fIJHOUI_Status2SetMode(ftr_actor, ftr_actor); if (parent != NULL) { @@ -88,14 +88,14 @@ static void fIJHOUI_mv(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, GAME* game, u ftr_actor->dynamic_work_s[0] = ftr_actor->state; } -static int fIJHOUI_DrawBefore(GAME* game, cKF_SkeletonInfo_R_c* keyf, int jointNum, Gfx** joint, u8* jointFlag, void* arg, - s_xyz* joint1, xyz_t* trans) { +static int fIJHOUI_DrawBefore(GAME* game, cKF_SkeletonInfo_R_c* keyf, int jointNum, Gfx** joint, u8* jointFlag, + void* arg, s_xyz* joint1, xyz_t* trans) { FTR_ACTOR* actor = (FTR_ACTOR*)arg; int offset = 10430.378f * (0.017453292f * actor->dynamic_work_f[1]); if (jointNum == 3) { - MY_ROOM_ACTOR* my_room_actor; + ACTOR* my_room_actor; int exists = FALSE; if ((Common_Get(clip).my_room_clip != NULL && Common_Get(clip).my_room_clip->my_room_actor_p != NULL)) { @@ -114,15 +114,15 @@ static int fIJHOUI_DrawBefore(GAME* game, cKF_SkeletonInfo_R_c* keyf, int jointN return 1; } -static int fIJHOUI_DrawAfter(GAME* game, cKF_SkeletonInfo_R_c* keyf, int jointNum, Gfx** joint, u8* jointFlag, void* arg, - s_xyz* joint1, xyz_t* trans) { +static int fIJHOUI_DrawAfter(GAME* game, cKF_SkeletonInfo_R_c* keyf, int jointNum, Gfx** joint, u8* jointFlag, + void* arg, s_xyz* joint1, xyz_t* trans) { return 1; } static void fIJHOUI_dw(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, GAME* game, u8* data) { Mtx* mtx = ftr_actor->skeleton_mtx[game->frame_counter & 1]; - - OPEN_DISP(game->graph); + + OPEN_DISP(game->graph); gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); @@ -131,29 +131,10 @@ static void fIJHOUI_dw(FTR_ACTOR* ftr_actor, ACTOR* my_room_actor, GAME* game, u } static aFTR_vtable_c fIJHOUI_func = { - &fIJHOUI_ct, - &fIJHOUI_mv, - &fIJHOUI_dw, - NULL, - NULL, + &fIJHOUI_ct, &fIJHOUI_mv, &fIJHOUI_dw, NULL, NULL, }; aFTR_PROFILE iam_ike_jny_houi01 = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - 40.0f, - 0.01f, - aFTR_SHAPE_TYPEA, - mCoBG_FTR_TYPEA, - 0, - 2, - 0, - 0, - &fIJHOUI_func, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 40.0f, 0.01f, aFTR_SHAPE_TYPEA, mCoBG_FTR_TYPEA, + 0, 2, 0, 0, &fIJHOUI_func, }; diff --git a/src/m_island.c b/src/m_island.c index 28a67534..2f70197d 100644 --- a/src/m_island.c +++ b/src/m_island.c @@ -10,835 +10,781 @@ static Island_c l_keepIsland; static u16 l_keepIslandComb[mISL_FG_BLOCK_X_NUM * mISL_FG_BLOCK_Z_NUM]; -static u8 l_misl_count_max_table[32] = { - 10, - 4, - 1, - 10, - 1, - 5, - 3, - 10, - 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 -}; +static u8 l_misl_count_max_table[32] = { 10, 4, 1, 10, 1, 5, 3, 10, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; static u8 l_misl_count_table[32]; extern void mISL_ClearKeepIsland() { - bzero(&l_keepIsland, sizeof(l_keepIsland)); + bzero(&l_keepIsland, sizeof(l_keepIsland)); } extern void mISL_KeepIsland(Island_c* island) { - if (mLd_CheckThisLand(island->landinfo.name, island->landinfo.id) == TRUE) { - bcopy(island, &l_keepIsland, sizeof(l_keepIsland)); - } + if (mLd_CheckThisLand(island->landinfo.name, island->landinfo.id) == TRUE) { + bcopy(island, &l_keepIsland, sizeof(l_keepIsland)); + } } static void mISL_KeepIslandComb(u16* dst, mFM_combination_c* combi, int count) { - while (count != 0 && dst != NULL && combi != NULL) { - count--; - dst[0] = combi[0].combination_type; - dst++; - combi++; - } + while (count != 0 && dst != NULL && combi != NULL) { + count--; + dst[0] = combi[0].combination_type; + dst++; + combi++; + } } static void mISL_RestoreIslandComb_com(mFM_combination_c* combi, u16* src, int count) { - while (count != 0 && src != NULL && combi != NULL) { - count--; - combi[0].combination_type = *src; - combi++; - src++; - } + while (count != 0 && src != NULL && combi != NULL) { + count--; + combi[0].combination_type = *src; + combi++; + src++; + } } static void mISL_RestoreIslandComb() { - int island_x_blocks[mISL_FG_BLOCK_X_NUM]; + int island_x_blocks[mISL_FG_BLOCK_X_NUM]; - mFI_GetIslandBlockNumX(island_x_blocks); + mFI_GetIslandBlockNumX(island_x_blocks); - if (island_x_blocks[0] > 0 && island_x_blocks[1] < (BLOCK_X_NUM - 1)) { - mISL_RestoreIslandComb_com(Save_GetPointer(combi_table[mISL_BLOCK_Z][island_x_blocks[0]]), l_keepIslandComb, mISL_FG_BLOCK_X_NUM); - } + if (island_x_blocks[0] > 0 && island_x_blocks[1] < (BLOCK_X_NUM - 1)) { + mISL_RestoreIslandComb_com(Save_GetPointer(combi_table[mISL_BLOCK_Z][island_x_blocks[0]]), l_keepIslandComb, + mISL_FG_BLOCK_X_NUM); + } } extern void mISL_ChangeBG() { - int island_x_blocks[mISL_FG_BLOCK_X_NUM]; + int island_x_blocks[mISL_FG_BLOCK_X_NUM]; - mFI_GetIslandBlockNumX(island_x_blocks); + mFI_GetIslandBlockNumX(island_x_blocks); - if (island_x_blocks[0] > 0 && island_x_blocks[1] < (BLOCK_X_NUM - 1)) { - mISL_KeepIslandComb(l_keepIslandComb, Save_GetPointer(combi_table[mISL_BLOCK_Z][island_x_blocks[0]]), mISL_FG_BLOCK_X_NUM); - mRF_IslandBgData_To_VillageData(); - mFM_RestoreIslandBG(island_x_blocks, mISL_FG_BLOCK_X_NUM); - } + if (island_x_blocks[0] > 0 && island_x_blocks[1] < (BLOCK_X_NUM - 1)) { + mISL_KeepIslandComb(l_keepIslandComb, Save_GetPointer(combi_table[mISL_BLOCK_Z][island_x_blocks[0]]), + mISL_FG_BLOCK_X_NUM); + mRF_IslandBgData_To_VillageData(); + mFM_RestoreIslandBG(island_x_blocks, mISL_FG_BLOCK_X_NUM); + } } extern void mISL_RestoreIsland() { - Island_c* island = Save_GetPointer(island); - Island_c* keep_island = &l_keepIsland; + Island_c* island = Save_GetPointer(island); + Island_c* keep_island = &l_keepIsland; - if (mLd_CheckThisLand(island->landinfo.name, island->landinfo.id) == FALSE) { - bcopy(keep_island, island, sizeof(l_keepIsland)); - mISL_RestoreIslandComb(); - } - else { - bcopy(island, keep_island, sizeof(l_keepIsland)); - } + if (mLd_CheckThisLand(island->landinfo.name, island->landinfo.id) == FALSE) { + bcopy(keep_island, island, sizeof(l_keepIsland)); + mISL_RestoreIslandComb(); + } else { + bcopy(island, keep_island, sizeof(l_keepIsland)); + } } extern void mISL_init(Island_c* island) { - mLd_ClearLandName(island->name); - bcopy(Save_GetPointer(land_info), &island->landinfo, sizeof(mLd_land_info_c)); - mHm_InitCottage(&island->cottage); - mNpc_DecideIslandNpc(&island->animal); - Save_Get(island).grass_tex_type = Save_Get(bg_tex_idx); + mLd_ClearLandName(island->name); + bcopy(Save_GetPointer(land_info), &island->landinfo, sizeof(mLd_land_info_c)); + mHm_InitCottage(&island->cottage); + mNpc_DecideIslandNpc(&island->animal); + Save_Get(island).grass_tex_type = Save_Get(bg_tex_idx); } static u32* mISL_GetCheckP(PersonalID_c* pid) { - Anmmem_c* memory = Save_Get(island).animal.memories; - u32* check_p = NULL; + Anmmem_c* memory = Save_Get(island).animal.memories; + u32* check_p = NULL; - if (pid != NULL && mPr_NullCheckPersonalID(pid) == FALSE) { - int idx = mNpc_GetAnimalMemoryIdx(pid, memory, ANIMAL_MEMORY_NUM); + if (pid != NULL && mPr_NullCheckPersonalID(pid) == FALSE) { + int idx = mNpc_GetAnimalMemoryIdx(pid, memory, ANIMAL_MEMORY_NUM); - if (idx != -1) { - check_p = &memory[idx].memuni.island.check; + if (idx != -1) { + check_p = &memory[idx].memuni.island.check; + } } - } - return check_p; + return check_p; } extern void mISL_ClearNowPlayerAction() { - Private_c* priv = Common_Get(now_private); + Private_c* priv = Common_Get(now_private); - if (priv != NULL) { - u32* check_p = mISL_GetCheckP(&priv->player_ID); + if (priv != NULL) { + u32* check_p = mISL_GetCheckP(&priv->player_ID); - if (check_p != NULL) { - check_p[0] = 0; + if (check_p != NULL) { + check_p[0] = 0; + } + + bzero(l_misl_count_table, sizeof(l_misl_count_table)); } - - bzero(l_misl_count_table, sizeof(l_misl_count_table)); - } } extern void mISL_SetPlayerAction(PersonalID_c* pid, u32 action) { - if (pid != NULL && mFI_CheckInIsland() == TRUE) { - u32* check_p = mISL_GetCheckP(pid); + if (pid != NULL && mFI_CheckInIsland() == TRUE) { + u32* check_p = mISL_GetCheckP(pid); - if (check_p != NULL) { - int i; + if (check_p != NULL) { + int i; - for (i = 0; i < ARRAY_COUNT(l_misl_count_table); i++) { - if (((action >> i) & 1) != 0) { - l_misl_count_table[i]++; + for (i = 0; i < ARRAY_COUNT(l_misl_count_table); i++) { + if (((action >> i) & 1) != 0) { + l_misl_count_table[i]++; + } + + if (l_misl_count_max_table[i] <= l_misl_count_table[i]) { + check_p[0] |= (1 << i); + l_misl_count_table[i] = l_misl_count_max_table[i]; + } + } } - - if (l_misl_count_max_table[i] <= l_misl_count_table[i]) { - check_p[0] |= (1 << i); - l_misl_count_table[i] = l_misl_count_max_table[i]; - } - } } - } } extern void mISL_SetNowPlayerAction(u32 action) { - Private_c* priv = Common_Get(now_private); + Private_c* priv = Common_Get(now_private); - if (priv != NULL) { - mISL_SetPlayerAction(&priv->player_ID, action); - } + if (priv != NULL) { + mISL_SetPlayerAction(&priv->player_ID, action); + } } extern int mISL_CheckPlayerAction(PersonalID_c* pid, u32 action) { - int res = FALSE; + int res = FALSE; - if (pid != NULL) { - u32* check_p = mISL_GetCheckP(pid); + if (pid != NULL) { + u32* check_p = mISL_GetCheckP(pid); - if (check_p != NULL && (check_p[0] & action) != 0) { - res = TRUE; + if (check_p != NULL && (check_p[0] & action) != 0) { + res = TRUE; + } } - } - return res; + return res; } extern int mISL_CheckNowPlayerAction(u32 action) { - Private_c* priv = Common_Get(now_private); - int res = FALSE; + Private_c* priv = Common_Get(now_private); + int res = FALSE; - if (priv != NULL) { - res = mISL_CheckPlayerAction(&priv->player_ID, action); - } + if (priv != NULL) { + res = mISL_CheckPlayerAction(&priv->player_ID, action); + } - return res; + return res; } static void mISL_int(u32* dst, u32* src, int n) { - int i; + int i; - for (i = n; i != 0; i--) { - u32 v = ((src[0] & 0xFF) << 24) | ((src[0] & 0xFF00) << 8) | ((src[0] >> 8) & 0xFF00) | ((src[0] >> 24) & 0xFF); - src++; - *dst++ = v; - } + for (i = n; i != 0; i--) { + u32 v = ((src[0] & 0xFF) << 24) | ((src[0] & 0xFF00) << 8) | ((src[0] >> 8) & 0xFF00) | ((src[0] >> 24) & 0xFF); + src++; + *dst++ = v; + } } static void mISL_short(register u16* dst, register u16* src, register int n) { - int i; + int i; - for (i = n; i != 0; i--) { - u16 v = ((src[0] & 0xFF) << 8 ) | ((src[0] & 0xFF00) >> 8); - src++; - *dst++ = v; - } + for (i = n; i != 0; i--) { + u16 v = ((src[0] & 0xFF) << 8) | ((src[0] & 0xFF00) >> 8); + src++; + *dst++ = v; + } } static void mISL_u64(u64* dst, u64* src, int n) { - int i; - - for (i = n; i != 0; i--) { - u32 src_hi; - u32 src_lo; - u32 dst_lo; - u32 dst_hi; - - src_hi = (u32)((src[0] >> 32) & 0xFFFFFFFF); - src_lo = (u32)(src[0] & 0xFFFFFFFF); - - mISL_int(&dst_lo, &src_hi, 1); - mISL_int(&dst_hi, &src_lo, 1); + int i; - *dst = (((u64)dst_hi) << 32) | (u64)dst_lo; - - src++; - dst++; - } + for (i = n; i != 0; i--) { + u32 src_hi; + u32 src_lo; + u32 dst_lo; + u32 dst_hi; + + src_hi = (u32)((src[0] >> 32) & 0xFFFFFFFF); + src_lo = (u32)(src[0] & 0xFFFFFFFF); + + mISL_int(&dst_lo, &src_hi, 1); + mISL_int(&dst_hi, &src_lo, 1); + + *dst = (((u64)dst_hi) << 32) | (u64)dst_lo; + + src++; + dst++; + } } static mActor_name_t l_misl_agb_npc_table[NPC_ISLANDER_NUM] = { - NPC_BLISS, - NPC_DOBIE, - NPC_OHARE, - NPC_DRIFT, - NPC_JUNE, - NPC_FAITH, - NPC_FLOSSIE, - NPC_FLASH, - NPC_MAELLE, - NPC_ANNALISE, - NPC_BUD, - NPC_ELINA, - NPC_BOOMER, - NPC_PIGLEG, - NPC_YODEL, - NPC_PLUCKY, - NPC_ROWAN, - NPC_ANKHA + NPC_BLISS, NPC_DOBIE, NPC_OHARE, NPC_DRIFT, NPC_JUNE, NPC_FAITH, NPC_FLOSSIE, NPC_FLASH, NPC_MAELLE, + NPC_ANNALISE, NPC_BUD, NPC_ELINA, NPC_BOOMER, NPC_PIGLEG, NPC_YODEL, NPC_PLUCKY, NPC_ROWAN, NPC_ANKHA }; static int mISL_get_npc_idx(mActor_name_t npc_id) { - mActor_name_t* agb_npc_table_p = l_misl_agb_npc_table; - int res = 0; - int i; + mActor_name_t* agb_npc_table_p = l_misl_agb_npc_table; + int res = 0; + int i; - if (ITEM_NAME_GET_TYPE(npc_id) == NAME_TYPE_NPC) { - for (i = 0; i < NPC_ISLANDER_NUM; i++) { - if (*agb_npc_table_p == npc_id) { - res = i; - break; - } + if (ITEM_NAME_GET_TYPE(npc_id) == NAME_TYPE_NPC) { + for (i = 0; i < NPC_ISLANDER_NUM; i++) { + if (*agb_npc_table_p == npc_id) { + res = i; + break; + } - agb_npc_table_p++; + agb_npc_table_p++; + } } - } - return res; + return res; } static void mISL_get_npc_tex(u32* dst, u32* src, int idx) { - if (idx != -1 && dst != NULL && src != NULL) { - u32 base_addr = JW_GetAramAddress(RESOURCE_D_OBJ_NPC_STOCK_SCH); - - _JW_GetResourceAram(base_addr + idx * (1024 * sizeof(u32)), (u8*)src, 1024 * sizeof(u32)); - mISL_int(dst, src, 1024); - } + if (idx != -1 && dst != NULL && src != NULL) { + u32 base_addr = JW_GetAramAddress(RESOURCE_D_OBJ_NPC_STOCK_SCH); + + _JW_GetResourceAram(base_addr + idx * (1024 * sizeof(u32)), (u8*)src, 1024 * sizeof(u32)); + mISL_int(dst, src, 1024); + } } static void mISL_get_npc_pal(u16* dst, u16* src, int idx) { - if (idx != -1 && dst != NULL && src != NULL) { - u32 base_addr = JW_GetAramAddress(RESOURCE_D_OBJ_NPC_STOCK_SCL); - - _JW_GetResourceAram(base_addr + idx * (16 * sizeof(u16)), (u8*)src, 16 * sizeof(u16)); - mISL_short(dst, src, 16); - } + if (idx != -1 && dst != NULL && src != NULL) { + u32 base_addr = JW_GetAramAddress(RESOURCE_D_OBJ_NPC_STOCK_SCL); + + _JW_GetResourceAram(base_addr + idx * (16 * sizeof(u16)), (u8*)src, 16 * sizeof(u16)); + mISL_short(dst, src, 16); + } } static void mISL_get_earth_tex(u32* dst, u32* src, int idx) { - if (idx < mFM_BG_TEX_NUM && dst != NULL && src != NULL) { - u32 base_addr = JW_GetAramAddress(RESOURCE_D_BG_ISLAND_SCH); - - _JW_GetResourceAram(base_addr + idx * (1024 * sizeof(u32)), (u8*)src, 1024 * sizeof(u32)); - mISL_int(dst, src, 1024); - } + if (idx < mFM_BG_TEX_NUM && dst != NULL && src != NULL) { + u32 base_addr = JW_GetAramAddress(RESOURCE_D_BG_ISLAND_SCH); + + _JW_GetResourceAram(base_addr + idx * (1024 * sizeof(u32)), (u8*)src, 1024 * sizeof(u32)); + mISL_int(dst, src, 1024); + } } static void mISL_gc_to_agb_iandinfo(mISL_landinfo_agb_c* agb, mLd_land_info_c* gc) { - bcopy(gc->name, agb->name, LAND_NAME_SIZE); - agb->exists = gc->exists; - mISL_short(&agb->id, &gc->id, 1); + bcopy(gc->name, agb->name, LAND_NAME_SIZE); + agb->exists = gc->exists; + mISL_short(&agb->id, &gc->id, 1); } static void mISL_agb_to_gc_iandinfo(mLd_land_info_c* gc, mISL_landinfo_agb_c* agb) { - bcopy(agb->name, gc->name, LAND_NAME_SIZE); - gc->exists = agb->exists; - mISL_short(&gc->id, &agb->id, 1); + bcopy(agb->name, gc->name, LAND_NAME_SIZE); + gc->exists = agb->exists; + mISL_short(&gc->id, &agb->id, 1); } static void mISL_gc_to_agb_fg(mActor_name_t* agb, mActor_name_t* gc) { - mISL_short(agb, gc, UT_TOTAL_NUM); + mISL_short(agb, gc, UT_TOTAL_NUM); } static void mISL_gc_to_agb_fg2(mActor_name_t* agb, mActor_name_t* gc) { - int i; + int i; - for (i = 0; i < UT_TOTAL_NUM; i++) { - mActor_name_t item; + for (i = 0; i < UT_TOTAL_NUM; i++) { + mActor_name_t item; - if (*gc == 0xF123) { - item = COTTAGE_MY; - } - else if (*gc == 0xF124) { - item = COTTAGE_NPC; - } - else if (*gc == 0xF122) { - item = FLAG; - } - else if (*gc == 0xF128) { - item = BOAT; - } - else if (*gc >= HOLE_START && *gc <= HOLE_END) { - item = EMPTY_NO; - } - else if (*gc == 0xF11F) { - item = ACTOR_PROP_VILLAGER_SIGNBOARD; - } - else { - item = *gc; - } + if (*gc == 0xF123) { + item = COTTAGE_MY; + } else if (*gc == 0xF124) { + item = COTTAGE_NPC; + } else if (*gc == 0xF122) { + item = FLAG; + } else if (*gc == 0xF128) { + item = BOAT; + } else if (*gc >= HOLE_START && *gc <= HOLE_END) { + item = EMPTY_NO; + } else if (*gc == 0xF11F) { + item = ACTOR_PROP_VILLAGER_SIGNBOARD; + } else { + item = *gc; + } - - mISL_short(agb, &item, 1); - agb++; - gc++; - } + mISL_short(agb, &item, 1); + agb++; + gc++; + } } static void mISL_agb_to_gc_fg(mActor_name_t* gc, mActor_name_t* agb) { - mISL_short(gc, agb, UT_TOTAL_NUM); + mISL_short(gc, agb, UT_TOTAL_NUM); } static void mISL_gc_to_agb_fgblock(mFM_fg_c* agb, mFM_fg_c* gc) { - int i; + int i; - for (i = 0; i < mISL_FG_BLOCK_X_NUM; i++) { - mISL_gc_to_agb_fg2(agb->items[0], gc->items[0]); - agb++; - gc++; - } + for (i = 0; i < mISL_FG_BLOCK_X_NUM; i++) { + mISL_gc_to_agb_fg2(agb->items[0], gc->items[0]); + agb++; + gc++; + } } static void mISL_agb_to_gc_fgblock(mFM_fg_c* gc, mFM_fg_c* agb) { - int i; + int i; - for (i = 0; i < mISL_FG_BLOCK_X_NUM; i++) { - mISL_agb_to_gc_fg(gc->items[0], agb->items[0]); - agb++; - gc++; - } + for (i = 0; i < mISL_FG_BLOCK_X_NUM; i++) { + mISL_agb_to_gc_fg(gc->items[0], agb->items[0]); + agb++; + gc++; + } } static void mISL_gc_to_agb_layer(mHm_lyr_c* agb, mHm_lyr_c* gc) { - int i; + int i; - for (i = 0; i < mHm_LAYER_NUM; i++) { - mISL_gc_to_agb_fg(agb->items[0], gc->items[0]); - mISL_u64(&agb->ftr_switch, &gc->ftr_switch, 1); - mISL_int(agb->unk_208, gc->unk_208, ARRAY_COUNT(agb->unk_208)); + for (i = 0; i < mHm_LAYER_NUM; i++) { + mISL_gc_to_agb_fg(agb->items[0], gc->items[0]); + mISL_u64(&agb->ftr_switch, &gc->ftr_switch, 1); + mISL_int(agb->haniwa_step, gc->haniwa_step, ARRAY_COUNT(agb->haniwa_step)); - agb++; - gc++; - } + agb++; + gc++; + } } static void mISL_gc_to_agb_fllot_bit(u32* agb, mHm_fllot_bit_c* gc) { - mHm_fllot_bit_c tmp[4]; + mHm_fllot_bit_c tmp[4]; - bzero(tmp, sizeof(tmp)); - tmp[0].wall_original = gc->wall_original; - tmp[0].floor_original = gc->floor_original; - mISL_int(agb, (u32*)tmp, 1); + bzero(tmp, sizeof(tmp)); + tmp[0].wall_original = gc->wall_original; + tmp[0].floor_original = gc->floor_original; + mISL_int(agb, (u32*)tmp, 1); } static void mISL_agb_to_gc_fllot_bit(mHm_fllot_bit_c* gc, u32* agb) { - mHm_fllot_bit_c tmp[4]; + mHm_fllot_bit_c tmp[4]; - bzero(tmp, sizeof(tmp)); - mISL_int((u32*)tmp, agb, 1); + bzero(tmp, sizeof(tmp)); + mISL_int((u32*)tmp, agb, 1); - /* @BUG - devs made an oopsie and reused GC here */ - #ifndef BUGFIXES - gc->wall_original = (u32)gc->wall_original; - gc->floor_original = (u32)gc->floor_original; - #else - gc->wall_original = agb->wall_original; - gc->floor_original = agb->floor_original; - #endif +/* @BUG - devs made an oopsie and reused GC here */ +#ifndef BUGFIXES + gc->wall_original = (u32)gc->wall_original; + gc->floor_original = (u32)gc->floor_original; +#else + gc->wall_original = agb->wall_original; + gc->floor_original = agb->floor_original; +#endif } static void mISL_gc_to_agb_cottage_floor(mISL_flr_agb_c* agb, mHm_flr_c* gc) { - mISL_gc_to_agb_layer(agb->layers, &gc->layer_main); - bcopy(&gc->wall_floor, &agb->wall_floor, sizeof(gc->wall_floor)); - bcopy(&gc->tempo_beat, &agb->tempo_beat, sizeof(gc->tempo_beat)); - mISL_gc_to_agb_fllot_bit(&agb->floor_bit_info, &gc->floor_bit_info); + mISL_gc_to_agb_layer(agb->layers, &gc->layer_main); + bcopy(&gc->wall_floor, &agb->wall_floor, sizeof(gc->wall_floor)); + bcopy(&gc->tempo_beat, &agb->tempo_beat, sizeof(gc->tempo_beat)); + mISL_gc_to_agb_fllot_bit(&agb->floor_bit_info, &gc->floor_bit_info); } static void mISL_agb_to_gc_cottage_floor(mHm_flr_c* gc, mISL_flr_agb_c* agb) { - mISL_gc_to_agb_layer(&gc->layer_main, agb->layers); - bcopy(&agb->wall_floor, &gc->wall_floor, sizeof(gc->wall_floor)); - bcopy(&agb->tempo_beat, &gc->tempo_beat, sizeof(gc->tempo_beat)); - mISL_agb_to_gc_fllot_bit(&gc->floor_bit_info, &agb->floor_bit_info); + mISL_gc_to_agb_layer(&gc->layer_main, agb->layers); + bcopy(&agb->wall_floor, &gc->wall_floor, sizeof(gc->wall_floor)); + bcopy(&agb->tempo_beat, &gc->tempo_beat, sizeof(gc->tempo_beat)); + mISL_agb_to_gc_fllot_bit(&gc->floor_bit_info, &agb->floor_bit_info); } static void mISL_gc_to_agb_ymd(lbRTC_ymd_c* agb, lbRTC_ymd_c* gc) { - mISL_short(&agb->year, &gc->year, 1); - agb->month = gc->month; - agb->day = gc->day; + mISL_short(&agb->year, &gc->year, 1); + agb->month = gc->month; + agb->day = gc->day; } static void mISL_gc_to_agb_time(lbRTC_time_c* agb, lbRTC_time_c* gc) { - agb->sec = gc->sec; - agb->min = gc->min; - agb->hour = gc->hour; - agb->day = gc->day; - agb->weekday = gc->weekday; - agb->month = gc->month; - mISL_short(&agb->year, &gc->year, 1); + agb->sec = gc->sec; + agb->min = gc->min; + agb->hour = gc->hour; + agb->day = gc->day; + agb->weekday = gc->weekday; + agb->month = gc->month; + mISL_short(&agb->year, &gc->year, 1); } static void mISL_gc_to_agb_goki(mHm_goki_c* agb, mHm_goki_c* gc) { - mISL_gc_to_agb_time(&agb->time, &gc->time); - agb->num = gc->num; + mISL_gc_to_agb_time(&agb->time, &gc->time); + agb->num = gc->num; } static void mISL_agb_to_gc_goki(mHm_goki_c* gc, mHm_goki_c* agb) { - mISL_gc_to_agb_time(&gc->time, &agb->time); - gc->num = agb->num; + mISL_gc_to_agb_time(&gc->time, &agb->time); + gc->num = agb->num; } static void mISL_gc_to_agb_cottage(mISL_cottage_agb_c* agb, mHm_cottage_c* gc) { - bcopy(&gc->unused_wall_floor, &agb->unused_wall_floor, sizeof(gc->unused_wall_floor)); - bcopy(gc->unk_2, agb->unk_2, sizeof(gc->unk_2)); - mISL_gc_to_agb_cottage_floor(&agb->room, &gc->room); - agb->unk_8B8 = gc->unk_4; - agb->unk_8B9 = gc->unk_5; - mISL_gc_to_agb_goki(&agb->goki, &gc->goki); - mISL_int(agb->music_box, gc->music_box, 2); + bcopy(&gc->unused_wall_floor, &agb->unused_wall_floor, sizeof(gc->unused_wall_floor)); + bcopy(gc->unk_2, agb->unk_2, sizeof(gc->unk_2)); + mISL_gc_to_agb_cottage_floor(&agb->room, &gc->room); + agb->unk_8B8 = gc->unk_4; + agb->unk_8B9 = gc->unk_5; + mISL_gc_to_agb_goki(&agb->goki, &gc->goki); + mISL_int(agb->music_box, gc->music_box, 2); } static void mISL_agb_to_gc_cottage(mHm_cottage_c* gc, mISL_cottage_agb_c* agb) { - bcopy(&agb->unused_wall_floor, &gc->unused_wall_floor, sizeof(gc->unused_wall_floor)); - bcopy(agb->unk_2, gc->unk_2, sizeof(gc->unk_2)); - gc->unk_4 = agb->unk_8B8; - gc->unk_5 = agb->unk_8B9; - mISL_agb_to_gc_cottage_floor(&gc->room, &agb->room); - mISL_agb_to_gc_goki(&gc->goki, &agb->goki); - mISL_int(gc->music_box, agb->music_box, 2); + bcopy(&agb->unused_wall_floor, &gc->unused_wall_floor, sizeof(gc->unused_wall_floor)); + bcopy(agb->unk_2, gc->unk_2, sizeof(gc->unk_2)); + gc->unk_4 = agb->unk_8B8; + gc->unk_5 = agb->unk_8B9; + mISL_agb_to_gc_cottage_floor(&gc->room, &agb->room); + mISL_agb_to_gc_goki(&gc->goki, &agb->goki); + mISL_int(gc->music_box, agb->music_box, 2); } static void mISL_gc_to_agb_mail(mISL_Anmplmail_agb_c* agb, Anmplmail_c* gc) { - agb->font = gc->font; - agb->paper_type = gc->paper_type; - agb->present = gc->present; - agb->header_back_start = gc->header_back_start; - bcopy(gc->header, agb->header, MAIL_HEADER_LEN); - bcopy(gc->body, agb->body, MAIL_BODY_LEN); - bcopy(gc->footer, agb->footer, MAIL_FOOTER_LEN); - mISL_gc_to_agb_ymd(&agb->date, &gc->date); + agb->font = gc->font; + agb->paper_type = gc->paper_type; + agb->present = gc->present; + agb->header_back_start = gc->header_back_start; + bcopy(gc->header, agb->header, MAIL_HEADER_LEN); + bcopy(gc->body, agb->body, MAIL_BODY_LEN); + bcopy(gc->footer, agb->footer, MAIL_FOOTER_LEN); + mISL_gc_to_agb_ymd(&agb->date, &gc->date); } static void mISL_agb_to_gc_mail(Anmplmail_c* gc, mISL_Anmplmail_agb_c* agb) { - gc->font = agb->font; - gc->paper_type = agb->paper_type; - gc->present = agb->present; - gc->header_back_start = agb->header_back_start; - bcopy(agb->header, gc->header, MAIL_HEADER_LEN); - bcopy(agb->body, gc->body, MAIL_BODY_LEN); - bcopy(agb->footer, gc->footer, MAIL_FOOTER_LEN); - mISL_gc_to_agb_ymd(&gc->date, &agb->date); + gc->font = agb->font; + gc->paper_type = agb->paper_type; + gc->present = agb->present; + gc->header_back_start = agb->header_back_start; + bcopy(agb->header, gc->header, MAIL_HEADER_LEN); + bcopy(agb->body, gc->body, MAIL_BODY_LEN); + bcopy(agb->footer, gc->footer, MAIL_FOOTER_LEN); + mISL_gc_to_agb_ymd(&gc->date, &agb->date); } static void mIS_gc_to_agb_anmpersonal(AnmPersonalID_c* agb, AnmPersonalID_c* gc) { - mISL_short(&agb->npc_id, &gc->npc_id, 1); - mISL_short(&agb->land_id, &gc->land_id, 1); - bcopy(gc->land_name, agb->land_name, LAND_NAME_SIZE); - agb->name_id = gc->name_id; - agb->looks = gc->looks; + mISL_short(&agb->npc_id, &gc->npc_id, 1); + mISL_short(&agb->land_id, &gc->land_id, 1); + bcopy(gc->land_name, agb->land_name, LAND_NAME_SIZE); + agb->name_id = gc->name_id; + agb->looks = gc->looks; } static void mIS_agb_to_gc_anmpersonal(AnmPersonalID_c* gc, AnmPersonalID_c* agb) { - mISL_short(&gc->npc_id, &agb->npc_id, 1); - mISL_short(&gc->land_id, &agb->land_id, 1); - bcopy(agb->land_name, gc->land_name, LAND_NAME_SIZE); - gc->name_id = agb->name_id; - gc->looks = agb->looks; + mISL_short(&gc->npc_id, &agb->npc_id, 1); + mISL_short(&gc->land_id, &agb->land_id, 1); + bcopy(agb->land_name, gc->land_name, LAND_NAME_SIZE); + gc->name_id = agb->name_id; + gc->looks = agb->looks; } static void mISL_gc_to_agb_personal(PersonalID_c* agb, PersonalID_c* gc) { - bcopy(gc->player_name, agb->player_name, PLAYER_NAME_LEN); - bcopy(gc->land_name, agb->land_name, LAND_NAME_SIZE); - mISL_short(&agb->player_id, &gc->player_id, 1); - mISL_short(&agb->land_id, &gc->land_id, 1); + bcopy(gc->player_name, agb->player_name, PLAYER_NAME_LEN); + bcopy(gc->land_name, agb->land_name, LAND_NAME_SIZE); + mISL_short(&agb->player_id, &gc->player_id, 1); + mISL_short(&agb->land_id, &gc->land_id, 1); } static void mISL_gc_to_agb_memuni(memuni_u* agb, memuni_u* gc) { - mISL_int((u32*)agb, (u32*)gc, sizeof(memuni_u) / sizeof(u32)); + mISL_int((u32*)agb, (u32*)gc, sizeof(memuni_u) / sizeof(u32)); } static void mISL_agb_to_gc_memuni(memuni_u* gc, memuni_u* agb) { - mISL_int((u32*)gc, (u32*)agb, sizeof(memuni_u) / sizeof(u32)); + mISL_int((u32*)gc, (u32*)agb, sizeof(memuni_u) / sizeof(u32)); } static void mISL_gc_to_agb_memletter(u32* agb, Anmlet_c* gc) { - Anmlet_c t[4]; + Anmlet_c t[4]; - bzero(t, sizeof(t)); - t[0].exists = gc->exists; - t[0].cond = gc->cond; - t[0].send_reply = gc->send_reply; - t[0].has_present_cloth = gc->has_present_cloth; - t[0].wearing_present_cloth = gc->wearing_present_cloth; - mISL_int(agb, (u32*)t, 1); + bzero(t, sizeof(t)); + t[0].exists = gc->exists; + t[0].cond = gc->cond; + t[0].send_reply = gc->send_reply; + t[0].has_present_cloth = gc->has_present_cloth; + t[0].wearing_present_cloth = gc->wearing_present_cloth; + mISL_int(agb, (u32*)t, 1); } static void mISL_agb_to_gc_memletter(Anmlet_c* gc, u32* agb) { - Anmlet_c t[4]; + Anmlet_c t[4]; - bzero(t, sizeof(t)); - mISL_int((u32*)t, agb, 1); - gc->exists = t[0].exists; - gc->cond = t[0].cond; - gc->send_reply = t[0].send_reply; - gc->has_present_cloth = t[0].has_present_cloth; - gc->wearing_present_cloth = t[0].wearing_present_cloth; + bzero(t, sizeof(t)); + mISL_int((u32*)t, agb, 1); + gc->exists = t[0].exists; + gc->cond = t[0].cond; + gc->send_reply = t[0].send_reply; + gc->has_present_cloth = t[0].has_present_cloth; + gc->wearing_present_cloth = t[0].wearing_present_cloth; } static void mISL_gc_to_agb_memory(mISL_Anmmem_agb_c* agb, Anmmem_c* gc) { - mISL_gc_to_agb_personal(&agb->player_id, &gc->memory_player_id); - mISL_gc_to_agb_time(&agb->last_speak_time, &gc->last_speak_time); - mISL_gc_to_agb_memuni(&agb->memuni, &gc->memuni); - /* @BUG - devs forgot to save this, but remembered to restore it */ - #ifdef BUGFIXES - mISL_u64(&agb->saved_town_tune, &gc->saved_town_tune, 1); - #endif - agb->friendship = gc->friendship; - mISL_gc_to_agb_memletter(&agb->letter_info, &gc->letter_info); - mISL_gc_to_agb_mail(&agb->letter, &gc->letter); + mISL_gc_to_agb_personal(&agb->player_id, &gc->memory_player_id); + mISL_gc_to_agb_time(&agb->last_speak_time, &gc->last_speak_time); + mISL_gc_to_agb_memuni(&agb->memuni, &gc->memuni); +/* @BUG - devs forgot to save this, but remembered to restore it */ +#ifdef BUGFIXES + mISL_u64(&agb->saved_town_tune, &gc->saved_town_tune, 1); +#endif + agb->friendship = gc->friendship; + mISL_gc_to_agb_memletter(&agb->letter_info, &gc->letter_info); + mISL_gc_to_agb_mail(&agb->letter, &gc->letter); } static void mISL_agb_to_gc_memory(Anmmem_c* gc, mISL_Anmmem_agb_c* agb) { - mISL_gc_to_agb_personal(&gc->memory_player_id, &agb->player_id); - mISL_gc_to_agb_time(&gc->last_speak_time, &agb->last_speak_time); - mISL_agb_to_gc_memuni(&gc->memuni, &agb->memuni); - mISL_u64(&gc->saved_town_tune, &agb->saved_town_tune, 1); - gc->friendship = agb->friendship; - mISL_agb_to_gc_memletter(&gc->letter_info, &agb->letter_info); - mISL_agb_to_gc_mail(&gc->letter, &agb->letter); + mISL_gc_to_agb_personal(&gc->memory_player_id, &agb->player_id); + mISL_gc_to_agb_time(&gc->last_speak_time, &agb->last_speak_time); + mISL_agb_to_gc_memuni(&gc->memuni, &agb->memuni); + mISL_u64(&gc->saved_town_tune, &agb->saved_town_tune, 1); + gc->friendship = agb->friendship; + mISL_agb_to_gc_memletter(&gc->letter_info, &agb->letter_info); + mISL_agb_to_gc_mail(&gc->letter, &agb->letter); } - static void mISL_gc_to_agb_qclass(mISL_quest_base_c* agb, mQst_base_c* gc) { - mQst_base_c t; - - bzero(&t, sizeof(t)); - t.quest_type = gc->quest_type; - t.quest_kind = gc->quest_kind; - t.time_limit_enabled = gc->time_limit_enabled; - t.progress = gc->progress; - t.give_reward = gc->give_reward; - mISL_int(&agb->info, (u32*)&t, 1); - mISL_gc_to_agb_time(&agb->time_limit, &gc->time_limit); + mQst_base_c t; + + bzero(&t, sizeof(t)); + t.quest_type = gc->quest_type; + t.quest_kind = gc->quest_kind; + t.time_limit_enabled = gc->time_limit_enabled; + t.progress = gc->progress; + t.give_reward = gc->give_reward; + mISL_int(&agb->info, (u32*)&t, 1); + mISL_gc_to_agb_time(&agb->time_limit, &gc->time_limit); } static void mISL_agb_to_gc_qclass(mQst_base_c* gc, mISL_quest_base_c* agb) { - mQst_base_c t; - - bzero(&t, sizeof(t)); - mISL_int((u32*)&t, &agb->info, 1); - gc->quest_type = t.quest_type; - gc->quest_kind = t.quest_kind; - gc->time_limit_enabled = t.time_limit_enabled; - gc->progress = t.progress; - gc->give_reward = t.give_reward; - mISL_gc_to_agb_time(&gc->time_limit, &agb->time_limit); + mQst_base_c t; + + bzero(&t, sizeof(t)); + mISL_int((u32*)&t, &agb->info, 1); + gc->quest_type = t.quest_type; + gc->quest_kind = t.quest_kind; + gc->time_limit_enabled = t.time_limit_enabled; + gc->progress = t.progress; + gc->give_reward = t.give_reward; + mISL_gc_to_agb_time(&gc->time_limit, &agb->time_limit); } static void mISL_gc_to_agb_qdata(mQst_contest_info_u* agb, mQst_contest_info_u* gc) { - mISL_int((u32*)agb, (u32*)gc, sizeof(mQst_contest_info_u) / sizeof(u32)); + mISL_int((u32*)agb, (u32*)gc, sizeof(mQst_contest_info_u) / sizeof(u32)); } static void mISL_agb_to_gc_qdata(mQst_contest_info_u* gc, mQst_contest_info_u* agb) { - mISL_int((u32*)gc, (u32*)agb, sizeof(mQst_contest_info_u) / sizeof(u32)); + mISL_int((u32*)gc, (u32*)agb, sizeof(mQst_contest_info_u) / sizeof(u32)); } static void mISL_gc_to_agb_quest(mISL_quest_contest_c* agb, mQst_contest_c* gc) { - mISL_gc_to_agb_qclass(&agb->base, &gc->base); - mISL_short(&agb->requested_item, &gc->requested_item, 1); - mISL_gc_to_agb_personal(&agb->player_id, &gc->player_id); - agb->type = gc->type; - mISL_gc_to_agb_qdata(&agb->info, &gc->info); + mISL_gc_to_agb_qclass(&agb->base, &gc->base); + mISL_short(&agb->requested_item, &gc->requested_item, 1); + mISL_gc_to_agb_personal(&agb->player_id, &gc->player_id); + agb->type = gc->type; + mISL_gc_to_agb_qdata(&agb->info, &gc->info); } static void mISL_agb_to_gc_quest(mQst_contest_c* gc, mISL_quest_contest_c* agb) { - mISL_agb_to_gc_qclass(&gc->base, &agb->base); - mISL_short(&gc->requested_item, &agb->requested_item, 1); - mISL_gc_to_agb_personal(&agb->player_id, &gc->player_id); - gc->type = agb->type; - mISL_agb_to_gc_qdata(&gc->info, &agb->info); + mISL_agb_to_gc_qclass(&gc->base, &agb->base); + mISL_short(&gc->requested_item, &agb->requested_item, 1); + mISL_gc_to_agb_personal(&agb->player_id, &gc->player_id); + gc->type = agb->type; + mISL_agb_to_gc_qdata(&gc->info, &agb->info); } static void mISL_gc_to_agb_anmuni(anmuni_u* agb, anmuni_u* gc) { - mISL_int((u32*)agb, (u32*)gc, sizeof(anmuni_u) / sizeof(u32)); + mISL_int((u32*)agb, (u32*)gc, sizeof(anmuni_u) / sizeof(u32)); } static void mISL_agb_to_gc_anmuni(anmuni_u* gc, anmuni_u* agb) { - mISL_int((u32*)gc, (u32*)agb, sizeof(anmuni_u) / sizeof(u32)); + mISL_int((u32*)gc, (u32*)agb, sizeof(anmuni_u) / sizeof(u32)); } static void mISL_gc_to_agb_hp_mail(AnmHPMail_c* agb, AnmHPMail_c* gc) { - mISL_gc_to_agb_time(&agb->receive_time, &gc->receive_time); - bcopy(gc->password, agb->password, sizeof(gc->password)); + mISL_gc_to_agb_time(&agb->receive_time, &gc->receive_time); + bcopy(gc->password, agb->password, sizeof(gc->password)); } static void mISL_agb_to_gc_hp_mail(AnmHPMail_c* gc, AnmHPMail_c* agb) { - mISL_gc_to_agb_time(&gc->receive_time, &agb->receive_time); - bcopy(agb->password, gc->password, sizeof(gc->password)); + mISL_gc_to_agb_time(&gc->receive_time, &agb->receive_time); + bcopy(agb->password, gc->password, sizeof(gc->password)); } static void mISL_gc_to_agb_animal(mISL_Animal_agb_c* agb, Animal_c* gc) { - int i; + int i; - mIS_gc_to_agb_anmpersonal(&agb->id, &gc->id); - for (i = 0; i < ANIMAL_MEMORY_NUM; i++) { - mISL_gc_to_agb_memory(&agb->memories[i], &gc->memories[i]); - } + mIS_gc_to_agb_anmpersonal(&agb->id, &gc->id); + for (i = 0; i < ANIMAL_MEMORY_NUM; i++) { + mISL_gc_to_agb_memory(&agb->memories[i], &gc->memories[i]); + } - bcopy(&gc->home_info, &agb->home_info, sizeof(Anmhome_c)); - bcopy(gc->catchphrase, agb->catchphrase, ANIMAL_CATCHPHRASE_LEN); - mISL_gc_to_agb_quest(&agb->contest_quest, &gc->contest_quest); - bcopy(gc->parent_name, agb->parent_name, PLAYER_NAME_LEN); - mISL_gc_to_agb_anmuni(&agb->anmuni, &gc->anmuni); - agb->mood = gc->mood; - agb->mood_time = gc->mood_time; - mISL_short(&agb->cloth, &gc->cloth, 1); - mISL_short(&agb->remove_info, &gc->remove_info, 1); - agb->is_home = gc->is_home; - agb->moved_in = gc->moved_in; - agb->removing = gc->removing; - agb->cloth_original_id = gc->cloth_original_id; - agb->umbrella_id = gc->umbrella_id; - agb->unk_932 = gc->unk_8ED; - mISL_short(&agb->present_cloth, &gc->present_cloth, 1); - bcopy(gc->animal_relations, agb->animal_relations, ANIMAL_NUM_MAX); + bcopy(&gc->home_info, &agb->home_info, sizeof(Anmhome_c)); + bcopy(gc->catchphrase, agb->catchphrase, ANIMAL_CATCHPHRASE_LEN); + mISL_gc_to_agb_quest(&agb->contest_quest, &gc->contest_quest); + bcopy(gc->parent_name, agb->parent_name, PLAYER_NAME_LEN); + mISL_gc_to_agb_anmuni(&agb->anmuni, &gc->anmuni); + agb->mood = gc->mood; + agb->mood_time = gc->mood_time; + mISL_short(&agb->cloth, &gc->cloth, 1); + mISL_short(&agb->remove_info, &gc->remove_info, 1); + agb->is_home = gc->is_home; + agb->moved_in = gc->moved_in; + agb->removing = gc->removing; + agb->cloth_original_id = gc->cloth_original_id; + agb->umbrella_id = gc->umbrella_id; + agb->unk_932 = gc->unk_8ED; + mISL_short(&agb->present_cloth, &gc->present_cloth, 1); + bcopy(gc->animal_relations, agb->animal_relations, ANIMAL_NUM_MAX); - for (i = 0; i < ANIMAL_HP_MAIL_NUM; i++) { - mISL_gc_to_agb_hp_mail(&agb->hp_mail[i], &gc->hp_mail[i]); - } + for (i = 0; i < ANIMAL_HP_MAIL_NUM; i++) { + mISL_gc_to_agb_hp_mail(&agb->hp_mail[i], &gc->hp_mail[i]); + } } static void mISL_agb_to_gc_animal(Animal_c* gc, mISL_Animal_agb_c* agb) { - int i; + int i; - mIS_agb_to_gc_anmpersonal(&gc->id, &agb->id); - for (i = 0; i < ANIMAL_MEMORY_NUM; i++) { - mISL_agb_to_gc_memory(&gc->memories[i], &agb->memories[i]); - } + mIS_agb_to_gc_anmpersonal(&gc->id, &agb->id); + for (i = 0; i < ANIMAL_MEMORY_NUM; i++) { + mISL_agb_to_gc_memory(&gc->memories[i], &agb->memories[i]); + } - bcopy(&agb->home_info, &gc->home_info, sizeof(Anmhome_c)); - bcopy(agb->catchphrase, gc->catchphrase, ANIMAL_CATCHPHRASE_LEN); - mISL_agb_to_gc_quest(&gc->contest_quest, &agb->contest_quest); - bcopy(agb->parent_name, gc->parent_name, PLAYER_NAME_LEN); - mISL_agb_to_gc_anmuni(&gc->anmuni, &agb->anmuni); - gc->mood = agb->mood; - gc->mood_time = agb->mood_time; - mISL_short(&gc->cloth, &agb->cloth, 1); - mISL_short(&gc->remove_info, &agb->remove_info, 1); - gc->is_home = agb->is_home; - gc->moved_in = agb->moved_in; - gc->removing = agb->removing; - gc->cloth_original_id = agb->cloth_original_id; - gc->umbrella_id = agb->umbrella_id; - gc->unk_8ED = agb->unk_932; - mISL_short(&gc->present_cloth, &agb->present_cloth, 1); - bcopy(agb->animal_relations, gc->animal_relations, ANIMAL_NUM_MAX); + bcopy(&agb->home_info, &gc->home_info, sizeof(Anmhome_c)); + bcopy(agb->catchphrase, gc->catchphrase, ANIMAL_CATCHPHRASE_LEN); + mISL_agb_to_gc_quest(&gc->contest_quest, &agb->contest_quest); + bcopy(agb->parent_name, gc->parent_name, PLAYER_NAME_LEN); + mISL_agb_to_gc_anmuni(&gc->anmuni, &agb->anmuni); + gc->mood = agb->mood; + gc->mood_time = agb->mood_time; + mISL_short(&gc->cloth, &agb->cloth, 1); + mISL_short(&gc->remove_info, &agb->remove_info, 1); + gc->is_home = agb->is_home; + gc->moved_in = agb->moved_in; + gc->removing = agb->removing; + gc->cloth_original_id = agb->cloth_original_id; + gc->umbrella_id = agb->umbrella_id; + gc->unk_8ED = agb->unk_932; + mISL_short(&gc->present_cloth, &agb->present_cloth, 1); + bcopy(agb->animal_relations, gc->animal_relations, ANIMAL_NUM_MAX); - for (i = 0; i < ANIMAL_HP_MAIL_NUM; i++) { - mISL_agb_to_gc_hp_mail(&gc->hp_mail[i], &agb->hp_mail[i]); - } + for (i = 0; i < ANIMAL_HP_MAIL_NUM; i++) { + mISL_agb_to_gc_hp_mail(&gc->hp_mail[i], &agb->hp_mail[i]); + } } static int mISL_ReturnCheckSum(u8* data, int size) { - int checksum = 0; - int i; + int checksum = 0; + int i; - for (i = size; i != 0; i--) { - checksum += *data++; - } + for (i = size; i != 0; i--) { + checksum += *data++; + } - return checksum; + return checksum; } static u8 mISL_GetFlatCheckSum(u8* data, int size, u8 now_checksum, int ignored_section_checksum) { - int checksum = mISL_ReturnCheckSum(data, size); - u8 diff = (u8)(checksum - now_checksum) - ignored_section_checksum; + int checksum = mISL_ReturnCheckSum(data, size); + u8 diff = (u8)(checksum - now_checksum) - ignored_section_checksum; - diff = ~diff; - diff = diff + 1; + diff = ~diff; + diff = diff + 1; - return diff; + return diff; } extern void mISL_gc_to_agb(Island_agb_c* agb, Island_c* gc) { - int npc_idx; - u32* temp; + int npc_idx; + u32* temp; - if (agb != NULL) { - bcopy(gc->name, agb->name, mISL_ISLAND_NAME_LEN); - agb->in_use = FALSE; - mISL_gc_to_agb_iandinfo(&agb->landinfo, &gc->landinfo); - mISL_gc_to_agb_fgblock(agb->fgblock[0], gc->fgblock[0]); - mISL_gc_to_agb_cottage(&agb->cottage, &gc->cottage); - bcopy(&gc->flag_design, &agb->flag_design, sizeof(mNW_original_design_c)); - mISL_gc_to_agb_animal(&agb->animal, &gc->animal); - mISL_short(agb->deposit[0], gc->deposit[0], sizeof(gc->deposit) / sizeof(u16)); - bcopy(gc->bg_data, agb->bg_data, sizeof(gc->bg_data)); - mISL_gc_to_agb_time(&agb->renew_time, &gc->renew_time); + if (agb != NULL) { + bcopy(gc->name, agb->name, mISL_ISLAND_NAME_LEN); + agb->in_use = FALSE; + mISL_gc_to_agb_iandinfo(&agb->landinfo, &gc->landinfo); + mISL_gc_to_agb_fgblock(agb->fgblock[0], gc->fgblock[0]); + mISL_gc_to_agb_cottage(&agb->cottage, &gc->cottage); + bcopy(&gc->flag_design, &agb->flag_design, sizeof(mNW_original_design_c)); + mISL_gc_to_agb_animal(&agb->animal, &gc->animal); + mISL_short(agb->deposit[0], gc->deposit[0], sizeof(gc->deposit) / sizeof(u16)); + bcopy(gc->bg_data, agb->bg_data, sizeof(gc->bg_data)); + mISL_gc_to_agb_time(&agb->renew_time, &gc->renew_time); - if (Common_Get(island_weather) == mEnv_WEATHER_RAIN) { - agb->weather = mEnv_WEATHER_RAIN; + if (Common_Get(island_weather) == mEnv_WEATHER_RAIN) { + agb->weather = mEnv_WEATHER_RAIN; + } else { + agb->weather = mEnv_WEATHER_CLEAR; + } + + npc_idx = mISL_get_npc_idx(Save_Get(island).animal.id.npc_id); + mISL_int((u32*)&agb->npc_idx, (u32*)&npc_idx, 1); + temp = (u32*)zelda_malloc_align(0x1000, 32); + agb->grass_tex_type = gc->grass_tex_type; + + if (temp != NULL) { + bzero(temp, 0x1000); + mISL_get_npc_tex(agb->npc_tex, temp, npc_idx); + bzero(temp, 0x1000); + mISL_get_npc_pal(agb->npc_pal, (u16*)temp, npc_idx); + bzero(temp, 0x1000); + mISL_get_earth_tex(agb->earth_tex, temp, agb->grass_tex_type); + zelda_free(temp); + } + + agb->last_song_to_island = gc->last_song_to_island; + agb->last_song_from_island = gc->last_song_from_island; + // remove the land info portion from the checksum as it can change + agb->checksum = mISL_GetFlatCheckSum((u8*)agb, sizeof(Island_agb_c), agb->checksum, + mISL_ReturnCheckSum((u8*)&agb->landinfo, 16)); } - else { - agb->weather = mEnv_WEATHER_CLEAR; - } - - npc_idx = mISL_get_npc_idx(Save_Get(island).animal.id.npc_id); - mISL_int((u32*)&agb->npc_idx, (u32*)&npc_idx, 1); - temp = (u32*)zelda_malloc_align(0x1000, 32); - agb->grass_tex_type = gc->grass_tex_type; - - if (temp != NULL) { - bzero(temp, 0x1000); - mISL_get_npc_tex(agb->npc_tex, temp, npc_idx); - bzero(temp, 0x1000); - mISL_get_npc_pal(agb->npc_pal, (u16*)temp, npc_idx); - bzero(temp, 0x1000); - mISL_get_earth_tex(agb->earth_tex, temp, agb->grass_tex_type); - zelda_free(temp); - } - - agb->last_song_to_island = gc->last_song_to_island; - agb->last_song_from_island = gc->last_song_from_island; - // remove the land info portion from the checksum as it can change - agb->checksum = mISL_GetFlatCheckSum((u8*)agb, sizeof(Island_agb_c), agb->checksum, mISL_ReturnCheckSum((u8*)&agb->landinfo, 16)); - } } static void mISL_toHole(mActor_name_t* fg, u16* deposit, int bx, int bz) { - int ut_x; - int ut_z; + int ut_x; + int ut_z; - for (ut_z = 0; ut_z < UT_Z_NUM; ut_z++) { - for (ut_x = 0; ut_x < UT_X_NUM; ut_x++) { - if (*fg == ITM_PITFALL && (((*deposit) >> ut_x) & 1) != 0) { - int hole_no = mCoBG_BnumUnum2HoleNumber(bx, bz, ut_x, ut_z); + for (ut_z = 0; ut_z < UT_Z_NUM; ut_z++) { + for (ut_x = 0; ut_x < UT_X_NUM; ut_x++) { + if (*fg == ITM_PITFALL && (((*deposit) >> ut_x) & 1) != 0) { + int hole_no = mCoBG_BnumUnum2HoleNumber(bx, bz, ut_x, ut_z); - if (hole_no < 0 || hole_no >= 25) { - hole_no = 0; + if (hole_no < 0 || hole_no >= 25) { + hole_no = 0; + } + + fg[0] = BURIED_PITFALL_START + hole_no; + deposit[0] &= ~(1 << ut_x); + } + + fg++; } - fg[0] = BURIED_PITFALL_START + hole_no; - deposit[0] &= ~(1 << ut_x); - } - - fg++; + deposit++; } - - deposit++; - } } /* @nonmatching */ #ifndef MUST_MATCH extern void mISL_agb_to_gc(Island_c* gc, Island_agb_c* agb) { - int island_x_blocks[mISL_FG_BLOCK_X_NUM]; - int i; + int island_x_blocks[mISL_FG_BLOCK_X_NUM]; + int i; - if (agb != NULL) { - bcopy(agb->name, gc->name, mISL_ISLAND_NAME_LEN); - mISL_agb_to_gc_iandinfo(&gc->landinfo, &agb->landinfo); - mISL_agb_to_gc_fgblock(gc->fgblock[0], agb->fgblock[0]); - mISL_agb_to_gc_cottage(&gc->cottage, &agb->cottage); - bcopy(&agb->flag_design, &gc->flag_design, sizeof(mNW_original_design_c)); - mISL_agb_to_gc_animal(&gc->animal, &agb->animal); - mISL_short((u16*)gc->deposit, (u16*)agb->deposit, sizeof(gc->deposit) / sizeof(u16)); - bcopy(agb->bg_data, gc->bg_data, sizeof(gc->bg_data)); - mISL_gc_to_agb_time(&gc->renew_time, &agb->renew_time); - gc->last_song_to_island = agb->last_song_to_island; - gc->last_song_from_island = agb->last_song_from_island; + if (agb != NULL) { + bcopy(agb->name, gc->name, mISL_ISLAND_NAME_LEN); + mISL_agb_to_gc_iandinfo(&gc->landinfo, &agb->landinfo); + mISL_agb_to_gc_fgblock(gc->fgblock[0], agb->fgblock[0]); + mISL_agb_to_gc_cottage(&gc->cottage, &agb->cottage); + bcopy(&agb->flag_design, &gc->flag_design, sizeof(mNW_original_design_c)); + mISL_agb_to_gc_animal(&gc->animal, &agb->animal); + mISL_short((u16*)gc->deposit, (u16*)agb->deposit, sizeof(gc->deposit) / sizeof(u16)); + bcopy(agb->bg_data, gc->bg_data, sizeof(gc->bg_data)); + mISL_gc_to_agb_time(&gc->renew_time, &agb->renew_time); + gc->last_song_to_island = agb->last_song_to_island; + gc->last_song_from_island = agb->last_song_from_island; - if (mFI_CheckFieldData() == TRUE) { - bzero(island_x_blocks, sizeof(island_x_blocks)); - mFI_GetIslandBlockNumX(island_x_blocks); + if (mFI_CheckFieldData() == TRUE) { + bzero(island_x_blocks, sizeof(island_x_blocks)); + mFI_GetIslandBlockNumX(island_x_blocks); - for (i = 0; i < mISL_FG_BLOCK_X_NUM; i++) { - int idx = i + island_x_blocks[0]; - mActor_name_t* fg_p = &gc->fgblock[0][i].items[0][0]; - u16* deposit_p = (u16*)&gc->deposit[(u16)i]; // the access to deposit is strange, casting to u16 is incorrect but it makes all other instructions correct - - mISL_toHole(fg_p, deposit_p, idx, mISL_BLOCK_Z); - } + for (i = 0; i < mISL_FG_BLOCK_X_NUM; i++) { + int idx = i + island_x_blocks[0]; + mActor_name_t* fg_p = &gc->fgblock[0][i].items[0][0]; + u16* deposit_p = (u16*)&gc->deposit[(u16)i]; // the access to deposit is strange, casting to u16 is + // incorrect but it makes all other instructions correct + + mISL_toHole(fg_p, deposit_p, idx, mISL_BLOCK_Z); + } + } } - } } #else extern asm void mISL_agb_to_gc(Island_c* gc, Island_agb_c* agb) { - #include "asm/803b5948.s" +#include "asm/803b5948.s" } #endif diff --git a/src/m_room_type.c b/src/m_room_type.c index a212fe11..2559faa2 100644 --- a/src/m_room_type.c +++ b/src/m_room_type.c @@ -2019,9 +2019,9 @@ extern void mRmTp_MakeFamicom_Fdebug() { u16 ftr_idx; int res; Clip_c* clip; - GAME_PLAY* play = (GAME_PLAY*)gamePT; + GAME* game = gamePT; - if ((gamePT->pads[PAD1].on.button & BUTTON_Z) == BUTTON_Z && play != NULL) { + if ((gamePT->pads[PAD1].on.button & BUTTON_Z) == BUTTON_Z && game != NULL) { clip = Common_GetPointer(clip); if (clip->my_room_clip != NULL) { @@ -2036,10 +2036,10 @@ extern void mRmTp_MakeFamicom_Fdebug() { ftr_idx = 0x36A + mRmTp_famicom_idx; } - res = (*clip->my_room_clip->judge_breed_new_ftr_proc)(play, ftr_idx, &ut_x, &ut_z, &direct, &ofs, &layer); + res = (*clip->my_room_clip->judge_breed_new_ftr_proc)(game, ftr_idx, &ut_x, &ut_z, &direct, &ofs, &layer); if (res >= 0) { - (*clip->my_room_clip->reserve_ftr_proc)(play, ftr_idx, res, ut_x, ut_z, direct, ofs, layer); + (*clip->my_room_clip->reserve_ftr_proc)(game, ftr_idx, res, ut_x, ut_z, direct, ofs, layer); } } } diff --git a/tools/arc_tool.py b/tools/arc_tool.py index fec79ab9..3d45dba1 100644 --- a/tools/arc_tool.py +++ b/tools/arc_tool.py @@ -10,14 +10,13 @@ def unpack_dir(archive: pyjkernel.JKRArchive, dir: str, verbose=False): if verbose: print('Dumping file: ' + file.name) with open(os.path.join(dir, file.name), "wb") as f: - f.write(archive.get_file(dir + "/" + file.name).data) + f.write(archive.get_file(dir + os.sep + file.name).data) # create all subdirectories and recurse through them for subdir in archive.list_folders(dir): - if not os.path.exists(dir + "/" + subdir): - os.mkdir(dir + "/" + subdir) - unpack_dir(archive, dir + "/" + subdir, verbose) - + if not os.path.exists(dir + os.sep + subdir): + os.mkdir(dir + os.sep + subdir) + unpack_dir(archive, dir + os.sep + subdir, verbose) def unpack_archive(path: str, out_path: str, verbose=False): archive = pyjkernel.from_archive_file(path, True) @@ -38,13 +37,13 @@ def pack_dir(archive: pyjkernel.JKRArchive, path: str, verbose=False): for root, dirs, files in os.walk(local_root): files.sort(key=lambda item: (item.lower(), item)) for dir in dirs: - archive.create_folder(root + "/" + dir) + archive.create_folder(root + os.sep + dir) for file in files: if verbose: - print('Packing file: ' + root + '/' + file) - with open(root + "/" + file, "rb") as f: - archive.create_file(root + "/" + file, bytearray(f.read()), pyjkernel.JKRPreloadType.ARAM) + print('Packing file: ' + root + os.sep + file) + with open(root + os.sep + file, "rb") as f: + archive.create_file(root + os.sep + file, bytearray(f.read()), pyjkernel.JKRPreloadType.ARAM) os.chdir(orig_dir) def pack_archive(root_path: str, out_path: str, verbose=False):