From 6d1c592645a237299f7d1adffe55ed94086f227b Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Sun, 11 May 2025 01:11:33 -0400 Subject: [PATCH] Implement & link ac_needlework_indoor --- configure.py | 2 +- include/ac_needlework_indoor.h | 22 +- include/ac_needlework_indoor_clip.h | 42 +++ include/m_clip.h | 3 +- include/m_needlework.h | 5 +- src/actor/ac_needlework_indoor.c | 381 ++++++++++++++++++++++++++++ 6 files changed, 450 insertions(+), 5 deletions(-) create mode 100644 include/ac_needlework_indoor_clip.h create mode 100644 src/actor/ac_needlework_indoor.c diff --git a/configure.py b/configure.py index e00d9ba8..351e9e8b 100644 --- a/configure.py +++ b/configure.py @@ -1031,7 +1031,7 @@ config.libs = [ Object(Matching, "actor/ac_my_indoor.c"), Object(Matching, "actor/ac_my_room.c"), Object(Matching, "actor/ac_nameplate.c"), - Object(NonMatching, "actor/ac_needlework_indoor.c"), + Object(Matching, "actor/ac_needlework_indoor.c"), Object(Matching, "actor/ac_needlework_shop.c"), Object(Matching, "actor/ac_police_box.c"), Object(Matching, "actor/ac_post_office.c"), diff --git a/include/ac_needlework_indoor.h b/include/ac_needlework_indoor.h index 17272506..606922b8 100644 --- a/include/ac_needlework_indoor.h +++ b/include/ac_needlework_indoor.h @@ -3,11 +3,32 @@ #include "types.h" #include "m_actor.h" +#include "m_needlework.h" +#include "ac_needlework_indoor_clip.h" #ifdef __cplusplus extern "C" { #endif +typedef struct needlework_indoor_movebg_s { + xyz_t pos; + mCoBG_bg_regist_c regist; + int regist_idx; +} aNI_MoveBg_c; + +typedef struct needlework_indoor_actor_s NEEDLEWORK_INDOOR_ACTOR; + +/* sizeof(NEEDLEWORK_INDOOR_ACTOR) == 0x3F0 */ +struct needlework_indoor_actor_s { + /* 0x000 */ ACTOR actor_class; + /* 0x174 */ u8 _174[0x188 - 0x174]; + /* 0x188 */ mNW_original_design_c* data[2][mNW_TYPE_NUM][mNW_DESIGN_NUM]; + /* 0x1C8 */ int design_buf_idx[mNW_TYPE_NUM][mNW_DESIGN_NUM]; + /* 0x1E8 */ aNI_MoveBg_c cloth_move_bg[mNW_CLOTH_DESIGN_NUM]; + /* 0x2E8 */ aNI_MoveBg_c umbrella_move_bg[mNW_UMBRELLA_DESIGN_NUM]; + /* 0x3E8 */ aNI_Clip_c clip; +}; + extern ACTOR_PROFILE Needlework_Indoor_Profile; #ifdef __cplusplus @@ -15,4 +36,3 @@ extern ACTOR_PROFILE Needlework_Indoor_Profile; #endif #endif - diff --git a/include/ac_needlework_indoor_clip.h b/include/ac_needlework_indoor_clip.h new file mode 100644 index 00000000..7cb6e95c --- /dev/null +++ b/include/ac_needlework_indoor_clip.h @@ -0,0 +1,42 @@ +#ifndef AC_NEEDLEWORK_INDOOR_CLIP_H +#define AC_NEEDLEWORK_INDOOR_CLIP_H + +#include "types.h" +#include "m_actor_type.h" +#include "m_needlework.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int (*aNI_REQUESTCOPYCLOTHDATA_PROC)(int manekin_idx, mNW_original_design_c* design); +typedef int (*aNI_REQUESTCOPYUMBDATA_PROC)(int umbrella_idx, mNW_original_design_c* design); +typedef int (*aNI_REQUESTEXCHANGECLOTHDATA_PROC)(int manekin_idx, int player_org_idx); +typedef int (*aNI_REQUESTEXCHANGEUMBDATA_PROC)(int umbrella_idx, int player_org_idx); + +typedef struct needlework_indoor_clip_s { + ACTOR* needlework_indoor_actor_p; + int copy_cloth_data_requested; + aNI_REQUESTCOPYCLOTHDATA_PROC request_copy_cloth_data_proc; + int copy_cloth_data_idx; + mNW_original_design_c* copy_cloth_data_design_p; + int exchange_cloth_data_requested; + aNI_REQUESTEXCHANGECLOTHDATA_PROC request_exchange_cloth_data_proc; + int exchange_cloth_data_idx; + int exchange_cloth_data_player_org_idx; + int copy_umb_data_requested; + aNI_REQUESTCOPYUMBDATA_PROC request_copy_umb_data_proc; + int copy_umb_data_idx; + mNW_original_design_c* copy_umb_data_design_p; + int exchange_umb_data_requested; + aNI_REQUESTEXCHANGEUMBDATA_PROC request_exchange_umb_data_proc; + int exchange_umb_data_idx; + int exchange_umb_data_player_org_idx; + int _44; +} aNI_Clip_c; + +#ifdef __cplusplus +} +#endif + +#endif /* AC_NEEDLEWORK_INDOOR_CLIP_H */ diff --git a/include/m_clip.h b/include/m_clip.h index ca8d2ce3..56c3668d 100644 --- a/include/m_clip.h +++ b/include/m_clip.h @@ -35,6 +35,7 @@ #include "ac_hatumode_control.h" #include "ac_station_clip.h" #include "ac_mikanbox_clip.h" +#include "ac_needlework_indoor_clip.h" #ifdef __cplusplus extern "C" { @@ -46,7 +47,7 @@ typedef void (*CLIP_NONE_PROC)(); typedef struct clip_s { /* 0x000 */ BoxTrick01_data_c box_trick_data[4]; /* 0x020 */ int arrange_ftr_num; - /* 0x024 */ void* _024; + /* 0x024 */ aNI_Clip_c* needlework_indoor_clip; /* 0x028 */ void* misin_clip; /* 0x02C */ aHTBL_Clip_c* htbl_clip; /* 0x030 */ void* _030; diff --git a/include/m_needlework.h b/include/m_needlework.h index d69132cd..bc2cad61 100644 --- a/include/m_needlework.h +++ b/include/m_needlework.h @@ -13,8 +13,9 @@ extern "C" { #define mNW_ORIGINAL_DESIGN_HEIGHT 32 /* height */ #define mNW_DEFAULT_ORIGINAL_TEX_NUM 4 /* number of 'default' player textures which are not blank */ -#define mNW_CLOTH_DESIGN_NUM 4 /* number of clothing designs in Able Sisters' */ -#define mNW_UMBRELLA_DESIGN_NUM 4 /* number of umbrella designs in Able Sisters' */ +#define mNW_DESIGN_NUM 4 // default number of designs +#define mNW_CLOTH_DESIGN_NUM mNW_DESIGN_NUM /* number of clothing designs in Able Sisters' */ +#define mNW_UMBRELLA_DESIGN_NUM mNW_DESIGN_NUM /* number of umbrella designs in Able Sisters' */ #define mNW_TOTAL_DESIGN_NUM (mNW_CLOTH_DESIGN_NUM + mNW_UMBRELLA_DESIGN_NUM) /* total designs in Able Sisters' */ #define mNW_DESIGN_TEX_SIZE (mNW_ORIGINAL_DESIGN_HEIGHT * (mNW_ORIGINAL_DESIGN_WIDTH / 2)) /* total texture data size */ diff --git a/src/actor/ac_needlework_indoor.c b/src/actor/ac_needlework_indoor.c new file mode 100644 index 00000000..cd49ad78 --- /dev/null +++ b/src/actor/ac_needlework_indoor.c @@ -0,0 +1,381 @@ +#include "ac_needlework_indoor.h" + +#include "m_malloc.h" +#include "m_common_data.h" +#include "m_rcp.h" +#include "sys_matrix.h" + +#define aNI_GET_ACTOR() (CLIP(needlework_indoor_clip) != NULL ? CLIP(needlework_indoor_clip)->needlework_indoor_actor_p : NULL) + +static void Needlework_Indoor_Actor_ct(ACTOR* actorx, GAME* game); +static void Needlework_Indoor_Actor_dt(ACTOR* actorx, GAME* game); +static void Needlework_Indoor_Actor_move(ACTOR* actorx, GAME* game); +static void Needlework_Indoor_Actor_draw(ACTOR* actorx, GAME* game); + +ACTOR_PROFILE Needlework_Indoor_Profile = { + // clang-format off + mAc_PROFILE_NEEDLEWORK_INDOOR, + ACTOR_PART_BG, + ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_KEEP, + sizeof(NEEDLEWORK_INDOOR_ACTOR), + Needlework_Indoor_Actor_ct, + Needlework_Indoor_Actor_dt, + Needlework_Indoor_Actor_move, + Needlework_Indoor_Actor_draw, + NULL, + // clang-format on +}; + +static void aNI_SetClip(ACTOR* actorx); +static void aNI_CopyClothData(int idx, mNW_original_design_c* design, int se_flag); +static void aNI_ExchangeCloth(int idx, int player_org_idx, int se_flag); +static void aNI_CopyUmbData(int idx, mNW_original_design_c* design, int se_flag); +static void aNI_ExchangeUmb(int idx, int player_org_idx, int se_flag); + +static int aNI_RequestCopyClothData(int manekin_idx, mNW_original_design_c* design); +static int aNI_RequestCopyUmbData(int umbrella_idx, mNW_original_design_c* design); +static int aNI_RequestExchangeCloth(int manekin_idx, int player_org_idx); +static int aNI_RequestExchangeUmb(int umbrella_idx, int player_org_idx); + +static void aNI_CopyAllData(ACTOR* actorx, GAME* game) { + int i; + + for (i = 0; i < mNW_CLOTH_DESIGN_NUM; i++) { + aNI_CopyClothData(i, &Save_Get(needlework).original_design[i & 3], FALSE); + } + + for (i = 0; i < mNW_UMBRELLA_DESIGN_NUM; i++) { + aNI_CopyUmbData(i, &Save_Get(needlework).original_design[mNW_CLOTH_DESIGN_NUM + (i & 3)], FALSE); + } +} + +static void aNI_MallocRam(ACTOR* actorx) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + int i; + int j; + + for (i = 0; i < mNW_CLOTH_DESIGN_NUM; i++) { + for (j = 0; j < 2; j++) { + actor->data[j][mNW_TYPE_MANEKIN][i] = + (mNW_original_design_c*)zelda_malloc_align(sizeof(mNW_original_design_c), 32); + } + } + + for (i = 0; i < mNW_UMBRELLA_DESIGN_NUM; i++) { + for (j = 0; j < 2; j++) { + actor->data[j][mNW_TYPE_UMBRELLA][i] = + (mNW_original_design_c*)zelda_malloc_align(sizeof(mNW_original_design_c), 32); + } + } +} + +static void aNI_SetMoveBg(ACTOR* actorx) { + static mCoBG_bg_size_c l_manekin_mBgData = { 14.5f, 14.5f, 14.5f, 14.5f }; + static s16 dummy_angle = 0; + + static xyz_t manekin_pos[4] = { + // clang-format off + {180.0f, 40.0f, 100.0f}, + {220.0f, 40.0f, 100.0f}, + {260.0f, 40.0f, 100.0f}, + {300.0f, 40.0f, 100.0f}, + // clang-format on + }; + + static xyz_t umbrella_pos[4] = { + // clang-format off + {180.0f, 40.0f, 180.0f}, + {220.0f, 40.0f, 180.0f}, + {260.0f, 40.0f, 180.0f}, + {300.0f, 40.0f, 180.0f}, + // clang-format on + }; + + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + int i; + + for (i = 0; i < mNW_CLOTH_DESIGN_NUM; i++) { + actor->cloth_move_bg[i].pos = manekin_pos[i]; + actor->cloth_move_bg[i].regist_idx = + mCoBG_RegistMoveBg(&actor->cloth_move_bg[i].regist, &actor->cloth_move_bg[i].pos, NULL, &dummy_angle, 40.0f, + &l_manekin_mBgData, NULL, NULL, NULL, mCoBG_FTR_TYPE_NUM, mCoBG_ATTRIBUTE_STONE, 40.0f); + } + + for (i = 0; i < mNW_UMBRELLA_DESIGN_NUM; i++) { + actor->umbrella_move_bg[i].pos = umbrella_pos[i]; + actor->umbrella_move_bg[i].regist_idx = mCoBG_RegistMoveBg( + &actor->umbrella_move_bg[i].regist, &actor->umbrella_move_bg[i].pos, NULL, &dummy_angle, 40.0f, + &l_manekin_mBgData, NULL, NULL, NULL, mCoBG_FTR_TYPE_NUM, mCoBG_ATTRIBUTE_STONE, 40.0f); + } +} + +static void aNI_SetClip(ACTOR* actorx) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + + actor->clip.needlework_indoor_actor_p = actorx; + actor->clip.request_copy_cloth_data_proc = aNI_RequestCopyClothData; + actor->clip.request_copy_umb_data_proc = aNI_RequestCopyUmbData; + actor->clip.request_exchange_cloth_data_proc = aNI_RequestExchangeCloth; + actor->clip.request_exchange_umb_data_proc = aNI_RequestExchangeUmb; + CLIP(needlework_indoor_clip) = &actor->clip; +} + +static void Needlework_Indoor_Actor_ct(ACTOR* actorx, GAME* game) { + aNI_SetClip(actorx); + aNI_MallocRam(actorx); + aNI_SetMoveBg(actorx); + aNI_CopyAllData(actorx, game); +} + +static void aNI_FreeRam(ACTOR* actorx) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + int i; + int j; + + for (i = 0; i < 2; i++) { + for (j = 0; j < mNW_DESIGN_NUM; j++) { + zelda_free(actor->data[i][mNW_TYPE_MANEKIN][j]); + zelda_free(actor->data[i][mNW_TYPE_UMBRELLA][j]); + } + } +} + +static void Needlework_Indoor_Actor_dt(ACTOR* actorx, GAME* game) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + int i; + + for (i = 0; i < mNW_CLOTH_DESIGN_NUM; i++) { + mCoBG_CrossOffMoveBg(actor->cloth_move_bg[i].regist_idx); + } + + for (i = 0; i < mNW_UMBRELLA_DESIGN_NUM; i++) { + mCoBG_CrossOffMoveBg(actor->umbrella_move_bg[i].regist_idx); + } + + aNI_FreeRam(actorx); +} + +extern Gfx obj_shop_manekin_model[]; + +static void aNI_DrawManekin(ACTOR* actorx, GAME* game) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + int i; + + for (i = 0; i < mNW_CLOTH_DESIGN_NUM; i++) { + int idx = actor->design_buf_idx[mNW_TYPE_MANEKIN][i] & 1; + u8* texture = actor->data[idx][mNW_TYPE_MANEKIN][i]->design.data; + u16* palette = mNW_PaletteIdx2Palette(actor->data[idx][mNW_TYPE_MANEKIN][i]->palette); + + OPEN_DISP(game->graph); + + _texture_z_light_fog_prim(game->graph); + Matrix_translate(actor->cloth_move_bg[i].pos.x, actor->cloth_move_bg[i].pos.y, + actor->cloth_move_bg[i].pos.z, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + + gSPSegment(NEXT_POLY_OPA_DISP, ANIME_1_TXT_SEG, texture); + gSPSegment(NEXT_POLY_OPA_DISP, ANIME_2_TXT_SEG, palette); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(NEXT_POLY_OPA_DISP, obj_shop_manekin_model); + + CLOSE_DISP(game->graph); + } +} + +extern Gfx obj_shop_umbmy_model[]; + +static void aNI_DrawUmbrella(ACTOR* actorx, GAME* game) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + int i; + + for (i = 0; i < mNW_UMBRELLA_DESIGN_NUM; i++) { + int idx = actor->design_buf_idx[mNW_TYPE_UMBRELLA][i] & 1; + u8* texture = actor->data[idx][mNW_TYPE_UMBRELLA][i]->design.data; + u16* palette = mNW_PaletteIdx2Palette(actor->data[idx][mNW_TYPE_UMBRELLA][i]->palette); + + OPEN_DISP(game->graph); + + _texture_z_light_fog_prim(game->graph); + Matrix_translate(actor->umbrella_move_bg[i].pos.x, actor->umbrella_move_bg[i].pos.y, + actor->umbrella_move_bg[i].pos.z, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + + gSPSegment(NEXT_POLY_OPA_DISP, ANIME_2_TXT_SEG, texture); + gSPSegment(NEXT_POLY_OPA_DISP, ANIME_1_TXT_SEG, palette); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(NEXT_POLY_OPA_DISP, obj_shop_umbmy_model); + + CLOSE_DISP(game->graph); + } +} + +static void Needlework_Indoor_Actor_draw(ACTOR* actorx, GAME* game) { + aNI_DrawManekin(actorx, game); + aNI_DrawUmbrella(actorx, game); +} + +static void Needlework_Indoor_Actor_move(ACTOR* actorx, GAME* game) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + Submenu* submenu = &play->submenu; + + if (submenu->process_status == mSM_PROCESS_WAIT) { + if (actor->clip.copy_cloth_data_requested == TRUE) { + aNI_CopyClothData(actor->clip.copy_cloth_data_idx, actor->clip.copy_cloth_data_design_p, TRUE); + actor->clip.copy_cloth_data_requested = FALSE; + } + + if (actor->clip.exchange_cloth_data_requested == TRUE) { + aNI_ExchangeCloth(actor->clip.exchange_cloth_data_idx, actor->clip.exchange_cloth_data_player_org_idx, TRUE); + actor->clip.exchange_cloth_data_requested = FALSE; + } + + if (actor->clip.copy_umb_data_requested == TRUE) { + aNI_CopyUmbData(actor->clip.copy_umb_data_idx, actor->clip.copy_umb_data_design_p, TRUE); + actor->clip.copy_umb_data_requested = FALSE; + } + + if (actor->clip.exchange_umb_data_requested == TRUE) { + aNI_ExchangeUmb(actor->clip.exchange_umb_data_idx, actor->clip.exchange_umb_data_player_org_idx, TRUE); + actor->clip.exchange_umb_data_requested = FALSE; + } + } +} + +static int aNI_RequestCopyClothData(int manekin_idx, mNW_original_design_c* design) { + if (aNI_GET_ACTOR() != NULL) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + + if (actor->clip.copy_cloth_data_requested == FALSE) { + actor->clip.copy_cloth_data_idx = manekin_idx; + actor->clip.copy_cloth_data_design_p = design; + actor->clip.copy_cloth_data_requested = TRUE; + return TRUE; + } + } + + return FALSE; +} + +static void aNI_CopyClothData(int idx, mNW_original_design_c* design, int se_flag) { + idx &= 3; + + if (aNI_GET_ACTOR() != NULL) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + int buf_idx; + + actor->design_buf_idx[mNW_TYPE_MANEKIN][idx] = (actor->design_buf_idx[mNW_TYPE_MANEKIN][idx] + 1) & 1; + buf_idx = actor->design_buf_idx[mNW_TYPE_MANEKIN][idx]; + mNW_CopyOriginalTextureClass(actor->data[buf_idx][mNW_TYPE_MANEKIN][idx & 3], design); + mNW_CopyOriginalTextureClass(&Save_Get(needlework).original_design[idx & 3], design); + + if (se_flag == TRUE) { + sAdo_SysTrgStart(NA_SE_461); + } + } +} + +static int aNI_RequestExchangeCloth(int manekin_idx, int player_org_idx) { + if (aNI_GET_ACTOR() != NULL) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + + if (actor->clip.exchange_cloth_data_requested == FALSE) { + actor->clip.exchange_cloth_data_idx = manekin_idx; + actor->clip.exchange_cloth_data_player_org_idx = player_org_idx; + actor->clip.exchange_cloth_data_requested = TRUE; + return TRUE; + } + } + + return FALSE; +} + +static void aNI_ExchangeCloth(int idx, int player_org_idx, int se_flag) { + NEEDLEWORK_INDOOR_ACTOR* actor; + int buf_idx; + int tmp_idx; + + idx &= 3; + tmp_idx = idx & 3; + if (aNI_GET_ACTOR() != NULL) { + actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + buf_idx = actor->design_buf_idx[mNW_TYPE_MANEKIN][idx]; + + aNI_CopyClothData(idx, &Now_Private->my_org[player_org_idx & 7], FALSE); + mNW_CopyOriginalTextureClass(&Now_Private->my_org[player_org_idx & 7], actor->data[buf_idx][mNW_TYPE_MANEKIN][tmp_idx]); + + if (se_flag == TRUE) { + sAdo_SysTrgStart(NA_SE_461); + } + } +} + +static int aNI_RequestCopyUmbData(int umbrella_idx, mNW_original_design_c* design) { + if (aNI_GET_ACTOR() != NULL) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + + if (actor->clip.copy_umb_data_requested == FALSE) { + actor->clip.copy_umb_data_idx = umbrella_idx; + actor->clip.copy_umb_data_design_p = design; + actor->clip.copy_umb_data_requested = TRUE; + return TRUE; + } + } + + return FALSE; +} + +static void aNI_CopyUmbData(int idx, mNW_original_design_c* design, int se_flag) { + idx &= 3; + + if (aNI_GET_ACTOR() != NULL) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + int buf_idx; + + actor->design_buf_idx[mNW_TYPE_UMBRELLA][idx] = (actor->design_buf_idx[mNW_TYPE_UMBRELLA][idx] + 1) & 1; + buf_idx = actor->design_buf_idx[mNW_TYPE_UMBRELLA][idx]; + mNW_CopyOriginalTextureClass(actor->data[buf_idx][mNW_TYPE_UMBRELLA][idx & 3], design); + mNW_CopyOriginalTextureClass(&Save_Get(needlework).original_design[mNW_CLOTH_DESIGN_NUM + (idx & 3)], design); + + if (se_flag == TRUE) { + sAdo_SysTrgStart(NA_SE_461); + } + } +} + +static int aNI_RequestExchangeUmb(int umbrella_idx, int player_org_idx) { + if (aNI_GET_ACTOR() != NULL) { + NEEDLEWORK_INDOOR_ACTOR* actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + + if (actor->clip.exchange_umb_data_requested == FALSE) { + actor->clip.exchange_umb_data_idx = umbrella_idx; + actor->clip.exchange_umb_data_player_org_idx = player_org_idx; + actor->clip.exchange_umb_data_requested = TRUE; + return TRUE; + } + } + + return FALSE; +} + +static void aNI_ExchangeUmb(int idx, int player_org_idx, int se_flag) { + NEEDLEWORK_INDOOR_ACTOR* actor; + int buf_idx; + int tmp_idx; + + idx &= 3; + tmp_idx = idx & 3; + if (aNI_GET_ACTOR() != NULL) { + actor = (NEEDLEWORK_INDOOR_ACTOR*)aNI_GET_ACTOR(); + buf_idx = actor->design_buf_idx[mNW_TYPE_UMBRELLA][idx]; + + aNI_CopyUmbData(idx, &Now_Private->my_org[player_org_idx & 7], FALSE); + mNW_CopyOriginalTextureClass(&Now_Private->my_org[player_org_idx & 7], actor->data[buf_idx][mNW_TYPE_UMBRELLA][tmp_idx]); + + if (se_flag == TRUE) { + sAdo_SysTrgStart(NA_SE_461); + } + } +}