From 0d56d20af032f7b3db250eb7ba7ef4fdf800ecf8 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 16 Apr 2024 16:21:13 +0300 Subject: [PATCH] Adapt new findings about Rob Chara Item Cos --- src/CRE/rob/rob.cpp | 83 +++++++++++-------------- src/CRE/rob/rob.hpp | 4 ++ src/ReDIVA/data_test/rob_osage_test.cpp | 8 ++- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index 5ee7e966..fa21daee 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -1000,7 +1000,6 @@ static void motion_blend_mot_set_blend(motion_blend_mot* a1, static void motion_blend_mot_set_duration(motion_blend_mot* mot, float_t duration, float_t step, float_t offset); -static bool pv_osage_manager_array_get_disp(int32_t* chara_id); static PvOsageManager* pv_osage_manager_array_get(int32_t chara_id); static int pv_data_set_motion_quicksort_compare_func(void const* src1, void const* src2); @@ -7270,10 +7269,6 @@ static bool opd_decode_data(const void* data, float_t** opd_decod_buf, osage_pla return false; } -static bool pv_osage_manager_array_get_disp(int32_t* chara_id) { - return pv_osage_manager_array_get(*chara_id)->GetDisplay(); -} - static PvOsageManager* pv_osage_manager_array_get(int32_t chara_id) { if (chara_id >= ROB_CHARA_COUNT) chara_id = 0; @@ -13702,37 +13697,6 @@ static void sub_140522990(rob_chara_item_cos_data* item_cos_data) { } } -static void sub_14052B4C0(rob_chara_item_cos_data* item_cos_data, - rob_chara_item_equip* rob_itm_equip, item_id id, bool object) { - if (object) - rob_itm_equip->set_texture_pattern(0, 0); - else - rob_itm_equip->set_object_texture_pattern(id, 0, 0); -} - -static void sub_14052CCC0(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_itm_equip, - std::vector& item_nos, item_id id, bool a5) { - if (id < ITEM_BODY || id >= ITEM_MAX) - return; - - for (uint32_t& i : item_nos) { - auto elem = item_cos_data->texture_change.find(i); - if (elem == item_cos_data->texture_change.end()) - continue; - - for (item_cos_texture_change_tex& j : elem->second) - if (j.org && j.chg) - item_cos_data->texture_pattern[id].push_back({ j.org->id, j.chg->id }); - } - - if (a5) - rob_itm_equip->set_texture_pattern( - item_cos_data->texture_pattern[id].data(), item_cos_data->texture_pattern[id].size()); - else - rob_itm_equip->set_object_texture_pattern(id, - item_cos_data->texture_pattern[id].data(), item_cos_data->texture_pattern[id].size()); -} - static void sub_140522A30(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_itm_equip, const bone_database* bone_data, void* data, const object_database* obj_db) { const chara_init_data* chr_init_data = chara_init_data_get(item_cos_data->chara_index); @@ -13740,17 +13704,17 @@ static void sub_140522A30(rob_chara_item_cos_data* item_cos_data, rob_chara_item rob_itm_equip->load_outfit_object_info((item_id)i, chr_init_data->field_7E4[i - 1], false, bone_data, data, obj_db); auto elem = item_cos_data->item_change.find(i); - if (elem == item_cos_data->item_change.end()) - sub_14052B4C0(item_cos_data, rob_itm_equip, (item_id)i, false); + if (elem != item_cos_data->item_change.end()) + item_cos_data->set_texture_pattern(rob_itm_equip, elem->second, (item_id)i, false); else - sub_14052CCC0(item_cos_data, rob_itm_equip, elem->second, (item_id)i, false); + item_cos_data->set_texture_pattern(rob_itm_equip, (item_id)i, false); } for (int32_t i = ITEM_KAMI; i < ITEM_MAX; i++) { rob_itm_equip->load_body_parts_object_info((item_id)i, {}, bone_data, data, obj_db); - sub_14052B4C0(item_cos_data, rob_itm_equip, (item_id)i, false); + item_cos_data->set_texture_pattern(rob_itm_equip, (item_id)i, false); } - sub_14052B4C0(item_cos_data, rob_itm_equip, ITEM_NONE, true); + item_cos_data->set_texture_pattern(rob_itm_equip, ITEM_NONE, true); item_cos_data->field_F0.clear(); item_cos_data->field_100.clear(); @@ -14161,6 +14125,14 @@ void rob_chara_item_cos_data::set_item_zero(int32_t item_no) { cos.arr[item->sub_id] = 0; } +void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_itm_equip, + item_id id, bool tex_pat_for_all) { + if (tex_pat_for_all) + rob_itm_equip->set_texture_pattern(0, 0); + else + rob_itm_equip->set_object_texture_pattern(id, 0, 0); +} + void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_itm_equip, uint32_t item_no, item_id id, bool tex_pat_for_all) { if (id < ITEM_BODY || id >= ITEM_MAX) @@ -14181,6 +14153,29 @@ void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_itm_ texture_pattern[id].data(), texture_pattern[id].size()); } +void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_itm_equip, + const std::vector& item_nos, item_id id, bool tex_pat_for_all) { + if (id < ITEM_BODY || id >= ITEM_MAX) + return; + + for (const uint32_t& i : item_nos) { + auto elem = texture_change.find(i); + if (elem == texture_change.end()) + continue; + + for (item_cos_texture_change_tex& j : elem->second) + if (j.org && j.chg) + texture_pattern[id].push_back({ j.org->id, j.chg->id }); + } + + if (tex_pat_for_all) + rob_itm_equip->set_texture_pattern( + texture_pattern[id].data(), texture_pattern[id].size()); + else + rob_itm_equip->set_object_texture_pattern(id, + texture_pattern[id].data(), texture_pattern[id].size()); +} + void rob_chara_item_cos_data::texture_change_clear() { for (auto i : texture_change) for (item_cos_texture_change_tex& j : i.second) @@ -18580,11 +18575,7 @@ bool TaskRobDisp::dest() { void TaskRobDisp::disp() { for (rob_chara*& i : ctrl_chara) { - if (!i) - continue; - - int32_t chara_id = i->chara_id; - if (pv_osage_manager_array_get_disp(&chara_id)) + if (!i || pv_osage_manager_array_get_disp(i->chara_id)) continue; if (i->is_visible() && !(i->data.field_3 & 0x80)) diff --git a/src/CRE/rob/rob.hpp b/src/CRE/rob/rob.hpp index bca2f11a..c965dc3a 100644 --- a/src/CRE/rob/rob.hpp +++ b/src/CRE/rob/rob.hpp @@ -2374,8 +2374,12 @@ struct rob_chara_item_cos_data { void set_item_no(item_sub_id sub_id, int32_t item_no); void set_item_nos(const int32_t* item_nos); void set_item_zero(int32_t item_no); + void set_texture_pattern(rob_chara_item_equip* rob_itm_equip, + item_id id, bool tex_pat_for_all); void set_texture_pattern(rob_chara_item_equip* rob_itm_equip, uint32_t item_no, item_id id, bool tex_pat_for_all); + void set_texture_pattern(rob_chara_item_equip* rob_itm_equip, + const std::vector& item_nos, item_id id, bool tex_pat_for_all); void texture_change_clear(); void texture_pattern_clear(); }; diff --git a/src/ReDIVA/data_test/rob_osage_test.cpp b/src/ReDIVA/data_test/rob_osage_test.cpp index dafac8af..19d7a8ff 100644 --- a/src/ReDIVA/data_test/rob_osage_test.cpp +++ b/src/ReDIVA/data_test/rob_osage_test.cpp @@ -454,8 +454,12 @@ bool RobOsageTest::dest() { } void RobOsageTest::disp() { - disp_coli(); - disp_line(); + rob_chara* rob_chr = rob_chara_array_get(chara_id); + if (rob_chr && !pv_osage_manager_array_get_disp(chara_id) + && rob_chr->is_visible() && !(rob_chr->data.field_3 & 0x80)) { + disp_coli(); + disp_line(); + } } void RobOsageTest::basic() {