From 7d9f3edf9951a6cef27672a08f917d715316b93e Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Sat, 1 Jul 2023 18:54:51 -0400 Subject: [PATCH] Implement & link ac_structure.c --- config/rel_slices.yml | 5 + include/ac_structure.h | 105 ++++++++++- include/m_actor.h | 2 + include/m_actor_dlftbls.h | 6 +- include/m_field_info.h | 1 + include/m_name_table.h | 91 +++++++++- include/sys_vimgr.h | 2 +- rel/ac_structure.c | 354 ++++++++++++++++++++++++++++++++++++++ rel/m_actor_dlftbls.c | 2 +- rel/sys_vimgr.c | 6 +- 10 files changed, 562 insertions(+), 12 deletions(-) create mode 100644 rel/ac_structure.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 6b00ee48..e5e72c13 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -200,6 +200,11 @@ m_random_field/mRF_MakePerfectBit.c: .text: [0x8050B1AC, 0x8050B1D4] m_random_field/mRF_GetRandomStepMode.c: .text: [0x8050B284, 0x8050B2C0] +ac_structure.c: + .text: [0x805BCA00, 0x805BD06C] + .rodata: [0x8064AC30, 0x8064AC38] + .data: [0x806C6C00, 0x806C6ED0] + .bss: [0x813280F0, 0x8133DEB0] m_select.c: .text: [0x80627F88, 0x80629CA8] .rodata: [0x8064D1B0, 0x8064D1B8] diff --git a/include/ac_structure.h b/include/ac_structure.h index 1fc4f569..c1d27c81 100644 --- a/include/ac_structure.h +++ b/include/ac_structure.h @@ -3,18 +3,121 @@ #include "types.h" #include "m_actor.h" +#include "m_actor_dlftbls.h" #ifdef __cplusplus extern "C" { #endif -typedef ACTOR* (*aSTR_SETUP_ACTOR_PROC)(GAME_PLAY*, mActor_name_t, int, f32, f32); +#define aSTR_ACTOR_TBL_COUNT 9 +#define aSTR_OVERLAY_SIZE 0x2400 + +enum structure_type { + aSTR_TYPE_HOUSE1, + aSTR_TYPE_HOUSE2, + aSTR_TYPE_HOUSE3, + aSTR_TYPE_HOUSE4, + aSTR_TYPE_HOUSE5, + aSTR_TYPE_MYHOME, + aSTR_TYPE_6, + aSTR_TYPE_7, + aSTR_TYPE_SHOP1, + aSTR_TYPE_SHOP2, + aSTR_TYPE_SHOP3, + aSTR_TYPE_SHOP4, + aSTR_TYPE_POST_OFFICE, + aSTR_TYPE_STATION1, + aSTR_TYPE_STATION2, + aSTR_TYPE_STATION3, + aSTR_TYPE_TRAIN0, + aSTR_TYPE_TRAIN1, + aSTR_TYPE_POLICE_BOX, + aSTR_TYPE_FALLS, + aSTR_TYPE_FALLSESW, + aSTR_TYPE_SIGN, + aSTR_TYPE_SHRINE, + aSTR_TYPE_BRSHOP, + aSTR_TYPE_BUGGY, + aSTR_TYPE_S_CAR, + aSTR_TYPE_KAMAKURA, // also used for camping tent + aSTR_TYPE_GOZA, + aSTR_TYPE_RADIO, + aSTR_TYPE_YATAI, + aSTR_TYPE_TUKIMI, + aSTR_TYPE_TUKIMI2, + aSTR_TYPE_MIKUJI, + aSTR_TYPE_COUNT, + aSTR_TYPE_COUNT02, + aSTR_TYPE_SPORTSFAIR_A, + aSTR_TYPE_SPORTSFAIR_B, + aSTR_TYPE_TURI, + aSTR_TYPE_TURI2, + aSTR_TYPE_KOINOBORI, + aSTR_TYPE_DUMP, + aSTR_TYPE_WINDMILL, + aSTR_TYPE_LOTUS, + aSTR_TYPE_MIKANBOX, + aSTR_TYPE_DOUZOU, + aSTR_TYPE_TOUDAI, + aSTR_TYPE_GHOG, + aSTR_TYPE_HTABLE, + aSTR_TYPE_MUSEUM, + aSTR_TYPE_BRIDGE_A, + aSTR_TYPE_50, + aSTR_TYPE_NEEDLEWORK_SHOP, + aSTR_TYPE_FLAG, + aSTR_TYPE_BOAT, + aSTR_TYPE_COTTAGE_MY, + aSTR_TYPE_COTTAGE_NPC, + + aSTR_TYPE_NUM +}; + +typedef struct actor_structure_control_s STRUCTURE_CONTROL_ACTOR; +typedef struct actor_structure_s STRUCTURE_ACTOR; + +typedef STRUCTURE_ACTOR* (*aSTR_SETUP_ACTOR_PROC)(GAME*, mActor_name_t, s16, f32, f32); +typedef void (*aSTR_GET_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*); +typedef void (*aSTR_FREE_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*); +typedef STRUCTURE_ACTOR* (*aSTR_GET_ACTOR_AREA_PROC)(); +typedef void (*aSTR_FREE_ACTOR_AREA_PROC)(STRUCTURE_ACTOR*); +typedef u16* (*aSTR_GET_PAL_SEGMENT_PROC)(s16); + +struct actor_structure_s { + ACTOR actor_class; + u8 _174[0x2B0 - 0x174]; + int request_type; + u8 _2B4[0x2DC - 0x2B4]; +}; + +typedef struct actor_overlay_info_s { + u8* overlay_p; + int used; +} aSTR_Overlay_info_c; // TODO: finish clip typedef struct actor_structure_clip_s { aSTR_SETUP_ACTOR_PROC setup_actor_proc; + aSTR_GET_OVERLAY_AREA_PROC get_overlay_area_proc; + aSTR_FREE_OVERLAY_AREA_PROC free_overlay_area_proc; + aSTR_GET_ACTOR_AREA_PROC get_actor_area_proc; + aSTR_FREE_ACTOR_AREA_PROC free_actor_area_proc; + + STRUCTURE_ACTOR* structure_actor_tbl[aSTR_ACTOR_TBL_COUNT]; + int structure_actor_used_tbl[aSTR_ACTOR_TBL_COUNT]; + + aSTR_Overlay_info_c overlay_area[aSTR_ACTOR_TBL_COUNT]; + + aSTR_GET_PAL_SEGMENT_PROC get_pal_segment_proc; } aSTR_Clip_c; +struct actor_structure_control_s { + ACTOR actor_class; + int _174; + mActor_name_t str_door_name; + u8 reset; +}; + extern ACTOR_PROFILE Structure_Profile; #ifdef __cplusplus diff --git a/include/m_actor.h b/include/m_actor.h index 5f419771..866c140a 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -15,6 +15,7 @@ extern "C" { #endif typedef void (*mActor_proc)(ACTOR*, GAME*); +#define NONE_ACTOR_PROC ((mActor_proc)&none_proc1) #define ACTOR_STATE_NONE 0 #define ACTOR_STATE_NO_MOVE_WHILE_CULLED (1 << 4) @@ -398,6 +399,7 @@ extern ACTOR* Actor_info_fgName_search(Actor_info* actor_info, mActor_name_t fg_ extern void Actor_world_to_eye(ACTOR* actor, f32 eye_height); extern void Shape_Info_init(ACTOR* actor, f32 y_ofs, mActor_shadow_proc shadow_proc, f32 shadow_sizeX, f32 shadow_sizeZ); extern void Actor_position_moveF(ACTOR* actor); +extern ACTOR* Actor_info_make_actor(Actor_info* actor_info, GAME* game, s16 profile, f32 x, f32 y, f32 z, short rot_x, short rot_y, short rot_z, s8 block_x, s8 block_z, s16 mvactor_list_no, mActor_name_t actor_name, s16 arg, s8 npc_idx, int data_bank); extern void mAc_ActorShadowCircle(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play); extern void mAc_ActorShadowEllipse(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play); diff --git a/include/m_actor_dlftbls.h b/include/m_actor_dlftbls.h index ac0ea19b..57167a8d 100644 --- a/include/m_actor_dlftbls.h +++ b/include/m_actor_dlftbls.h @@ -8,7 +8,7 @@ extern "C" { #endif -typedef struct actor_dfltbl_s { +typedef struct actor_dlftbl_s { u32 rom_start; // unused in AC u32 rom_end; // unused in AC u8* ram_start; // used only with a check, but never set in AC @@ -19,10 +19,10 @@ typedef struct actor_dfltbl_s { u16 flags; // related to memory pinning but functionally useless in AC since alloc_buf is never allocated s8 num_actors; // number of this type of actor that currently exist s8 unk2; // unused in AC -} ACTOR_DFLTBL; +} ACTOR_DLFTBL; extern int actor_dlftbls_num; -extern ACTOR_DFLTBL actor_dlftbls[]; +extern ACTOR_DLFTBL actor_dlftbls[]; extern void actor_dlftbls_init(); extern void actor_dlftbls_cleanup(); diff --git a/include/m_field_info.h b/include/m_field_info.h index 8996574d..51496059 100644 --- a/include/m_field_info.h +++ b/include/m_field_info.h @@ -50,6 +50,7 @@ enum field_type2 { enum field_room { /* TODO: others */ + mFI_FIELD_FG = mFI_TO_FIELD_ID(mFI_FIELDTYPE_FG, 0), mFI_FIELD_PLAYER0_ROOM = mFI_TO_FIELD_ID(mFI_FIELDTYPE_PLAYER_ROOM, 0), mFI_FIELD_PLAYER1_ROOM, diff --git a/include/m_name_table.h b/include/m_name_table.h index 67a2723d..ed1b5f0e 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -59,6 +59,9 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITEM_NAME_GET_CAT(n) (((n) & 0x0F00) >> 8) #define ITEM_NAME_GET_INDEX(n) ((mActor_name_t)(n) & 0xFF) +#define NPC_HOUSE_ID_TO_NPC_ID(house) (house + 0x9000) +#define NPC_ID_TO_NPC_HOUSE_ID(npc) (npc - 0x9000) + #define ITEM_IS_FTR(n) \ (ITEM_NAME_GET_TYPE(n) == NAME_TYPE_FTR0 || ITEM_NAME_GET_TYPE(n) == NAME_TYPE_FTR1) @@ -468,14 +471,96 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define EXIT_DOOR 0x4080 +#define NPC_HOUSE_START 0x5000 +#define NPC_HOUSE000 NPC_HOUSE_START +// +#define NPC_HOUSE_END 0x50EE + #define STRUCTURE_START 0x5800 #define HOUSE0 (STRUCTURE_START) #define HOUSE1 (HOUSE0 + 1) #define HOUSE2 (HOUSE1 + 1) #define HOUSE3 (HOUSE2 + 1) -#define TRAIN_STATION 0x5809 -#define TRAIN0 0x580A -#define TRAIN1 0x580B +#define SHOP0 (HOUSE3 + 1) +#define SHOP1 (SHOP0 + 1) +#define SHOP2 (SHOP1 + 1) +#define SHOP3 (SHOP2 + 1) +#define POST_OFFICE (SHOP3 + 1) +#define TRAIN_STATION (POST_OFFICE + 1) +#define TRAIN0 (TRAIN_STATION + 1) +#define TRAIN1 (TRAIN0 + 1) +#define POLICE_STATION (TRAIN1 + 1) +#define WATERFALL_SOUTH (POLICE_STATION + 1) +#define WATERFALL_EAST (WATERFALL_SOUTH + 1) +#define WATERFALL_WEST (WATERFALL_EAST + 1) +#define SIGN00 (WATERFALL_WEST + 1) +#define SIGN01 (SIGN00 + 1) +#define SIGN02 (SIGN01 + 1) +#define SIGN03 (SIGN02 + 1) +#define SIGN04 (SIGN03 + 1) +#define SIGN05 (SIGN04 + 1) +#define SIGN06 (SIGN05 + 1) +#define SIGN07 (SIGN06 + 1) +#define SIGN08 (SIGN07 + 1) +#define SIGN09 (SIGN08 + 1) +#define SIGN10 (SIGN09 + 1) +#define SIGN11 (SIGN10 + 1) +#define SIGN12 (SIGN11 + 1) +#define SIGN13 (SIGN12 + 1) +#define SIGN14 (SIGN13 + 1) +#define SIGN15 (SIGN14 + 1) +#define SIGN16 (SIGN15 + 1) +#define SIGN17 (SIGN16 + 1) +#define SIGN18 (SIGN17 + 1) +#define SIGN19 (SIGN18 + 1) +#define SIGN20 (SIGN19 + 1) +#define WISHING_WELL (SIGN20 + 1) +#define BROKER_TENT (WISHING_WELL + 1) +#define FORTUNE_TENT (BROKER_TENT + 1) +#define DESIGNER_CAR (FORTUNE_TENT + 1) +#define KAMAKURA (DESIGNER_CAR + 1) +#define SAKURA_TABLE0 (KAMAKURA + 1) +#define SAKURA_TABLE1 (SAKURA_TABLE0 + 1) +#define AEROBICS_RADIO (SAKURA_TABLE1 + 1) +#define FIREWORKS_STALL0 (AEROBICS_RADIO + 1) +#define FIREWORKS_STALL1 (FIREWORKS_STALL0 + 1) +#define NEWYEAR_SHRINE0 (FIREWORKS_STALL1 + 1) +#define NEWYEAR_SHRINE1 (NEWYEAR_SHRINE0 + 1) +#define NEWYEAR_TABLE (NEWYEAR_SHRINE1 + 1) +#define NEWYEAR_COUNTDOWN0 (NEWYEAR_TABLE + 1) +#define NEWYEAR_COUNTDOWN1 (NEWYEAR_COUNTDOWN0 + 1) +#define SPORTSFAIR_BALLS_RED (NEWYEAR_COUNTDOWN1 + 1) +#define SPORTSFAIR_BALLS_WHITE (SPORTSFAIR_BALLS_RED + 1) +#define SPORTSFAIR_BASKET_RED (SPORTSFAIR_BALLS_WHITE + 1) +#define SPORTSFAIR_BASKET_WHITE (SPORTSFAIR_BASKET_RED + 1) +#define FISHCHECK_STAND0 (SPORTSFAIR_BASKET_WHITE + 1) +#define FISHCHECK_STAND1 (FISHCHECK_STAND0 + 1) +#define KOINOBORI_WINDSOCK (FISHCHECK_STAND1 + 1) +#define DUMP (KOINOBORI_WINDSOCK + 1) +#define WINDMILL0 (DUMP + 1) +#define WINDMILL1 (WINDMILL0 + 1) +#define WINDMILL2 (WINDMILL1 + 1) +#define WINDMILL3 (WINDMILL2 + 1) +#define WINDMILL4 (WINDMILL3 + 1) +#define LOTUS (WINDMILL4 + 1) +#define MIKANBOX (LOTUS + 1) +#define DOUZOU (MIKANBOX + 1) // train station statue +#define TOUDAI (DOUZOU + 1) // lighthouse +#define GHOG (TOUDAI + 1) +#define HTABLE0 (GHOG + 1) +#define HTABLE1 (HTABLE0 + 1) +#define HTABLE2 (HTABLE1 + 1) +#define TENT (HTABLE2 + 1) +#define MUSEUM (TENT + 1) +#define BRIDGE_A0 (MUSEUM + 1) +#define BRIDGE_A1 (BRIDGE_A0 + 1) +#define NEEDLEWORK_SHOP (BRIDGE_A1 + 1) +#define FLAG (NEEDLEWORK_SHOP + 1) +#define BOAT (FLAG + 1) +#define COTTAGE_MY (BOAT + 1) +#define COTTAGE_NPC (COTTAGE_MY + 1) +#define PORT_SIGN (COTTAGE_NPC + 1) +#define STRUCTURE_END (PORT_SIGN + 1) #define ETC_START 0x8000 #define ETC_AIRPLANE ETC_START diff --git a/include/sys_vimgr.h b/include/sys_vimgr.h index 6680ef69..b0dba3e4 100644 --- a/include/sys_vimgr.h +++ b/include/sys_vimgr.h @@ -4,6 +4,6 @@ #include "types.h" #include "dolphin/vi.h" -void viBlack(BOOL); +extern void viBlack(int black); #endif \ No newline at end of file diff --git a/rel/ac_structure.c b/rel/ac_structure.c new file mode 100644 index 00000000..424d346c --- /dev/null +++ b/rel/ac_structure.c @@ -0,0 +1,354 @@ +#include "ac_structure.h" + +#include "m_play.h" +#include "m_name_table.h" +#include "m_malloc.h" +#include "m_common_data.h" + +static void aSTR_actor_ct(ACTOR* actor, GAME* game); +static void aSTR_actor_dt(ACTOR* actor, GAME* game); +static void aSTR_actor_move(ACTOR* actor, GAME* game); + +ACTOR_PROFILE Structure_Profile = { + mAc_PROFILE_STRUCTURE, + ACTOR_PART_CONTROL, + ACTOR_STATE_NO_MOVE_WHILE_CULLED | ACTOR_STATE_NO_DRAW_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_3, + sizeof(STRUCTURE_CONTROL_ACTOR), + + &aSTR_actor_ct, + &aSTR_actor_dt, + &aSTR_actor_move, + NONE_ACTOR_PROC, + NULL +}; + +static u8 aSTR_overlay[aSTR_ACTOR_TBL_COUNT][aSTR_OVERLAY_SIZE]; +static STRUCTURE_ACTOR aSTR_actor_cl[aSTR_ACTOR_TBL_COUNT]; + +static void aSTR_init_clip_area(); +static void aSTR_free_clip_area(); + +static void aSTR_actor_ct(ACTOR* actor, GAME* game) { + STRUCTURE_CONTROL_ACTOR* structure = (STRUCTURE_CONTROL_ACTOR*)actor; + + aSTR_init_clip_area(); + structure->str_door_name = Common_Get(door_data).door_actor_name; + structure->reset = Common_Get(door_data).exit_type; +} + +static void aSTR_actor_dt(ACTOR* actor, GAME* game) { + aSTR_free_clip_area(); +} + +static int request[2]; // TODO: fix ordering by using separate TUs +static void aSTR_check_door_data(STRUCTURE_CONTROL_ACTOR* actor, GAME* game) { + //static int request[2] = { 4, 5 }; + + GAME_PLAY* play = (GAME_PLAY*)game; + + if (ITEM_NAME_GET_TYPE(actor->str_door_name) == NAME_TYPE_STRUCT) { + STRUCTURE_ACTOR* str_actor = (STRUCTURE_ACTOR*)Actor_info_fgName_search(&play->actor_info, actor->str_door_name, ACTOR_PART_ITEM); + + if (str_actor != NULL && str_actor->request_type == 0) { + str_actor->request_type = request[actor->reset == TRUE]; + actor->str_door_name = EMPTY_NO; + } + } + else { + actor->str_door_name = EMPTY_NO; + } +} + +static void aSTR_actor_move(ACTOR* actor, GAME* game) { + STRUCTURE_CONTROL_ACTOR* structure = (STRUCTURE_CONTROL_ACTOR*)actor; + switch (mFI_GetFieldId()) { + case mFI_FIELD_FG: + aSTR_check_door_data(structure, game); + break; + } +} + +extern u16* structure_pal_adrs_nowinter[]; +extern u16* structure_pal_adrs_winter[]; + +static u16* aSTR_get_pal_segment(s16 structure_type) { + static u16** pal_adrs_table[2] = { structure_pal_adrs_nowinter, structure_pal_adrs_winter }; + + int winter = Common_Get(time).season == mTM_SEASON_WINTER; + return pal_adrs_table[winter][structure_type]; +} + +typedef struct structure_setup_info_s { + s16 profile; + s16 structure_type; // aSTR_TYPE_* + s16 pal_no; + s16 pad; +} aSTR_setup_info; + +static STRUCTURE_ACTOR* aSTR_setupActor_proc(GAME* game, mActor_name_t structure_name, s16 arg, f32 x, f32 z) { + static aSTR_setup_info setupInfo_table[] = { + { mAc_PROFILE_MYHOUSE, 5, 25, 0 }, + { mAc_PROFILE_MYHOUSE, 5, 26, 0 }, + { mAc_PROFILE_MYHOUSE, 5, 27, 0 }, + { mAc_PROFILE_MYHOUSE, 5, 28, 0 }, + { mAc_PROFILE_SHOP, 8, 37, 0 }, + { mAc_PROFILE_CONVENI, 9, 38, 0 }, + { mAc_PROFILE_SUPER, 10, 39, 0 }, + { mAc_PROFILE_DEPART, 11, 40, 0 }, + { mAc_PROFILE_POST_OFFICE, 12, 41, 0 }, + { mAc_PROFILE_STATION, 13, 42, 0 }, + { mAc_PROFILE_TRAIN0, 16, 57, 0 }, + { mAc_PROFILE_TRAIN1, 17, 58, 0 }, + { mAc_PROFILE_POLICE_BOX, 18, 59, 0 }, + { mAc_PROFILE_FALLS, 19, 60, 0 }, + { mAc_PROFILE_FALLSESW, 20, 61, 0 }, + { mAc_PROFILE_FALLSESW, 20, 61, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + { mAc_PROFILE_SHRINE, 22, 63, 0 }, + { mAc_PROFILE_BRSHOP, 23, 64, 0 }, + { mAc_PROFILE_BUGGY, 24, 65, 0 }, + { mAc_PROFILE_S_CAR, 25, 66, 0 }, + { mAc_PROFILE_KAMAKURA, 26, 67, 0 }, + { mAc_PROFILE_GOZA, 27, 68, 0 }, + { mAc_PROFILE_GOZA, 27, 68, 0 }, + { mAc_PROFILE_RADIO, 28, 69, 0 }, + { mAc_PROFILE_YATAI, 29, 70, 0 }, + { mAc_PROFILE_YATAI, 29, 70, 0 }, + { mAc_PROFILE_TUKIMI, 30, 71, 0 }, + { mAc_PROFILE_TUKIMI, 31, 72, 0 }, + { mAc_PROFILE_MIKUJI, 32, 73, 0 }, + { mAc_PROFILE_COUNT, 33, 74, 0 }, + { mAc_PROFILE_COUNT02, 34, 75, 0 }, + { mAc_PROFILE_TAMA, 35, 76, 0 }, + { mAc_PROFILE_TAMA, 36, 77, 0 }, + { mAc_PROFILE_KAGO, 35, 76, 0 }, + { mAc_PROFILE_KAGO, 36, 77, 0 }, + { mAc_PROFILE_TURI, 37, 78, 0 }, + { mAc_PROFILE_TURI, 38, 79, 0 }, + { mAc_PROFILE_KOINOBORI, 39, 80, 0 }, + { mAc_PROFILE_DUMP, 40, 81, 0 }, + { mAc_PROFILE_WINDMILL, 41, 82, 0 }, + { mAc_PROFILE_WINDMILL, 41, 83, 0 }, + { mAc_PROFILE_WINDMILL, 41, 84, 0 }, + { mAc_PROFILE_WINDMILL, 41, 85, 0 }, + { mAc_PROFILE_WINDMILL, 41, 86, 0 }, + { mAc_PROFILE_LOTUS, 42, 87, 0 }, + { mAc_PROFILE_MIKANBOX, 43, 88, 0 }, + { mAc_PROFILE_DOUZOU, 44, 89, 0 }, + { mAc_PROFILE_TOUDAI, 45, 90, 0 }, + { mAc_PROFILE_GHOG, 46, 91, 0 }, + { mAc_PROFILE_HTABLE, 47, 91, 0 }, + { mAc_PROFILE_HTABLE, 47, 91, 0 }, + { mAc_PROFILE_HTABLE, 47, 91, 0 }, + { mAc_PROFILE_TENT, 26, 67, 0 }, + { mAc_PROFILE_MUSEUM, 48, 91, 0 }, + { mAc_PROFILE_BRIDGE_A, 49, 92, 0 }, + { mAc_PROFILE_BRIDGE_A, 49, 92, 0 }, + { mAc_PROFILE_NEEDLEWORK_SHOP, 51, 93, 0 }, + { mAc_PROFILE_FLAG, 52, 94, 0 }, + { mAc_PROFILE_BOAT, 53, 95, 0 }, + { mAc_PROFILE_COTTAGE_MY, 54, 96, 0 }, + { mAc_PROFILE_COTTAGE_NPC, 55, 97, 0 }, + { mAc_PROFILE_RESERVE, 21, 62, 0 }, + }; + + STRUCTURE_ACTOR* str_actor; + GAME_PLAY* play = (GAME_PLAY*)game; + s16 profile; + xyz_t pos; + + if (structure_name < NPC_HOUSE_END) { + mNpc_SearchAnimalinfo(Save_Get(animals), NPC_HOUSE_ID_TO_NPC_ID(structure_name), ANIMAL_NUM_MAX); + profile = mAc_PROFILE_HOUSE; + } + else if (structure_name >= HOUSE0 && structure_name < SHOP0) { + int idx = structure_name - STRUCTURE_START; + profile = setupInfo_table[idx].profile; + } + else if (structure_name >= TRAIN_STATION && structure_name < TRAIN0) { + profile = mAc_PROFILE_STATION; + } + else { + int idx = structure_name - STRUCTURE_START; + profile = setupInfo_table[idx].profile; + } + + pos.x = x; + pos.z = z; + pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f); + + str_actor = (STRUCTURE_ACTOR*)Actor_info_make_actor(&play->actor_info, game, profile, pos.x, pos.y, pos.z, 0, 0, 0, play->block_table.block_x, play->block_table.block_z, -1, structure_name, arg, -1, -1); + if (str_actor != NULL) { + mFI_SetFG_common(RSV_NO, pos, FALSE); + } + + return str_actor; +} + +static int aSTR_get_overlay_free_area_idx() { + aSTR_Clip_c* clip = Common_Get(clip).structure_clip; + aSTR_Overlay_info_c* overlay_info = clip->overlay_area; + int res = -1; + int i; + + for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) { + if (overlay_info->used == FALSE) { + res = i; + break; + } + overlay_info++; + } + + return res; +} + +static void aSTR_get_overlay_area_proc(ACTOR_DLFTBL* dlftbl) { + int overlay_idx = aSTR_get_overlay_free_area_idx(); + + if (overlay_idx != -1) { + aSTR_Overlay_info_c* overlay_info = Common_Get(clip).structure_clip->overlay_area + overlay_idx; + aSTR_Overlay_info_c* overlay2_info; + dlftbl->alloc_buf = overlay_info->overlay_p; + + overlay2_info = Common_Get(clip).structure_clip->overlay_area + overlay_idx; + overlay2_info->used = TRUE; + } + else { + dlftbl->alloc_buf = NULL; + } +} + +static void aSTR_free_overlay_area_proc(ACTOR_DLFTBL* dlftbl) { + aSTR_Clip_c* clip = Common_Get(clip).structure_clip; + aSTR_Overlay_info_c* overlay_info = clip->overlay_area; + int i; + + for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) { + if (overlay_info->overlay_p == dlftbl->alloc_buf) { + overlay_info->used = FALSE; + dlftbl->alloc_buf = NULL; + break; + } + overlay_info++; + } +} + +static STRUCTURE_ACTOR* aSTR_get_actor_area_proc() { + aSTR_Clip_c* clip = Common_Get(clip).structure_clip; + STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl; + int* str_used_tbl = clip->structure_actor_used_tbl; + + STRUCTURE_ACTOR* res = NULL; + int i; + + for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) { + if (*str_tbl != NULL && *str_used_tbl == FALSE) { + *str_used_tbl = TRUE; + res = *str_tbl; + break; + } + str_tbl++; + str_used_tbl++; + } + + return res; +} + +static void aSTR_free_actor_area_proc(STRUCTURE_ACTOR* str_actor) { + aSTR_Clip_c* clip = Common_Get(clip).structure_clip; + STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl; + int* str_used_tbl = clip->structure_actor_used_tbl; + int i; + + for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) { + if (*str_tbl == str_actor) { + *str_used_tbl = FALSE; + break; + } + str_tbl++; + str_used_tbl++; + } +} + +static void aSTR_init_clip_area() { + if (Common_Get(clip).structure_clip == NULL) { + int i; + + Common_Set(clip.structure_clip, (aSTR_Clip_c*)zelda_malloc(sizeof(aSTR_Clip_c))); + + Common_Get(clip).structure_clip->setup_actor_proc = &aSTR_setupActor_proc; + Common_Get(clip).structure_clip->get_overlay_area_proc = &aSTR_get_overlay_area_proc; + Common_Get(clip).structure_clip->free_overlay_area_proc = &aSTR_free_overlay_area_proc; + Common_Get(clip).structure_clip->get_actor_area_proc = &aSTR_get_actor_area_proc; + Common_Get(clip).structure_clip->free_actor_area_proc = &aSTR_free_actor_area_proc; + Common_Get(clip).structure_clip->get_pal_segment_proc = &aSTR_get_pal_segment; + + { + STRUCTURE_ACTOR** str_tbl = Common_Get(clip).structure_clip->structure_actor_tbl; + int* str_used_tbl = Common_Get(clip).structure_clip->structure_actor_used_tbl; + aSTR_Overlay_info_c* overlay_info = Common_Get(clip).structure_clip->overlay_area; + for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) { + *str_tbl = &aSTR_actor_cl[i]; + *str_used_tbl = FALSE; + + str_tbl++; + str_used_tbl++; + + overlay_info->overlay_p = aSTR_overlay[i]; + overlay_info->used = FALSE; + + overlay_info++; + } + } + } +} + +static void aSTR_free_clip_area() { + aSTR_Clip_c* clip = Common_Get(clip).structure_clip; + + if (clip != NULL) { + STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl; + aSTR_Overlay_info_c* overlay_info = clip->overlay_area; + int i; + + for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) { + if (*str_tbl != NULL) { + *str_tbl = NULL; + } + + if (overlay_info->overlay_p != NULL) { + overlay_info->overlay_p = NULL; + } + + str_tbl++; + overlay_info++; + } + + zelda_free(Common_Get(clip).structure_clip); + Common_Set(clip.structure_clip, NULL); + } +} + +static int request[2] = { 4, 5 }; // TODO: remove when separated TUs are implemented and aSTR_check_door_data is corrected diff --git a/rel/m_actor_dlftbls.c b/rel/m_actor_dlftbls.c index 71149028..33a86f48 100644 --- a/rel/m_actor_dlftbls.c +++ b/rel/m_actor_dlftbls.c @@ -253,7 +253,7 @@ {0,0,NULL,NULL,NULL,NULL,0,0,0,0} -ACTOR_DFLTBL actor_dlftbls[] = { +ACTOR_DLFTBL actor_dlftbls[] = { MAKE_ACTOR_DLF(Player), MAKE_ACTOR_DLF(BgItem), MAKE_ACTOR_DLF(Sample), diff --git a/rel/sys_vimgr.c b/rel/sys_vimgr.c index 3b923fc3..04134f1a 100644 --- a/rel/sys_vimgr.c +++ b/rel/sys_vimgr.c @@ -1,5 +1,5 @@ #include "sys_vimgr.h" -void viBlack(BOOL black){ - VISetBlack(black); -} \ No newline at end of file +extern void viBlack(int black) { + VISetBlack(black); +}