From eef24aed830a5223cb162741ab7f995486f66691 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Mon, 27 Apr 2026 01:43:32 +0300 Subject: [PATCH] Part 1 of ? of massive overhaul of Rob --- src/CRE/Glitter/effect_inst.cpp | 78 +- src/CRE/Glitter/file_reader.cpp | 8 +- src/CRE/Glitter/file_writer.cpp | 8 +- src/CRE/Glitter/glitter.cpp | 2 +- src/CRE/Glitter/glitter.hpp | 16 +- src/CRE/Glitter/render_scene.cpp | 4 +- src/CRE/auth_3d.cpp | 149 +- src/CRE/auth_3d.hpp | 12 +- src/CRE/customize_item_table.cpp | 14 +- src/CRE/customize_item_table.hpp | 4 +- src/CRE/effect.cpp | 323 +- src/CRE/hand_item.cpp | 63 +- src/CRE/hand_item.hpp | 4 +- src/CRE/item_table.cpp | 176 +- src/CRE/item_table.hpp | 162 +- src/CRE/light_param/wind.cpp | 3 +- src/CRE/mdl/disp_manager.cpp | 23 +- src/CRE/mdl/disp_manager.hpp | 24 +- src/CRE/mdl/draw_object.cpp | 16 +- src/CRE/pv_db.cpp | 9 +- src/CRE/pv_db.hpp | 2 +- src/CRE/pv_expression.cpp | 9 +- src/CRE/pv_param.cpp | 38 +- src/CRE/pv_param.hpp | 10 +- src/CRE/render.cpp | 10 +- src/CRE/render_context.hpp | 2 - src/CRE/renderer/dof.cpp | 9 +- src/CRE/rob/ex_block.cpp | 131 +- src/CRE/rob/motion.cpp | 212 +- src/CRE/rob/motion.hpp | 51 +- src/CRE/rob/rob.cpp | 15191 ++++++++-------- src/CRE/rob/rob.hpp | 3700 ++-- src/CRE/rob/skin_param.cpp | 112 +- src/CRE/rob/skin_param.hpp | 6 +- src/CRE/sss.cpp | 5 +- src/CRE/stage.cpp | 2 +- src/CRE/stage_modern.cpp | 4 +- src/CRE/task.cpp | 26 +- src/CRE/task.hpp | 3 + src/CRE/texture.cpp | 20 +- src/CRE/texture.hpp | 4 +- src/KKdLib/database/bone.cpp | 47 +- src/KKdLib/database/bone.hpp | 60 +- src/KKdLib/database/item_table.cpp | 116 +- src/KKdLib/database/item_table.hpp | 261 +- src/KKdLib/image.cpp | 42 +- src/KKdLib/image.hpp | 16 +- src/KKdLib/mot.cpp | 12 +- src/KKdLib/mot.hpp | 6 +- src/KKdLib/obj.cpp | 89 +- src/KKdLib/obj.hpp | 2 +- src/KKdLib/post_process_table/dof.cpp | 6 +- src/KKdLib/post_process_table/dof.hpp | 2 +- src/KKdLib/prj/bit_array.hpp | 225 + src/ReDIVA/app.cpp | 2 +- src/ReDIVA/data_edit/face_anim.cpp | 10 +- src/ReDIVA/data_edit/face_anim.hpp | 2 +- src/ReDIVA/data_edit/glitter_editor.cpp | 12 +- src/ReDIVA/data_edit/rob_chara_adjust.cpp | 52 +- .../data_process/effchrpv_auth_3d_to_mot.cpp | 305 +- .../data_process/effchrpv_auth_3d_to_mot.hpp | 2 +- src/ReDIVA/data_test/auth_3d_test.cpp | 112 +- src/ReDIVA/data_test/auth_3d_test.hpp | 9 +- src/ReDIVA/data_test/equip_test.cpp | 642 +- src/ReDIVA/data_test/equip_test.hpp | 22 +- src/ReDIVA/data_test/motion_test.cpp | 830 +- src/ReDIVA/data_test/motion_test.hpp | 74 +- src/ReDIVA/data_test/opd_test.cpp | 14 +- src/ReDIVA/data_test/rob_osage_test.cpp | 90 +- src/ReDIVA/data_test/rob_osage_test.hpp | 18 +- src/ReDIVA/data_view/auth_3d.cpp | 5 +- src/ReDIVA/graphics/color_change.cpp | 138 +- src/ReDIVA/pv_game/pv_game.cpp | 388 +- src/ReDIVA/pv_game/pv_game.hpp | 42 +- src/ReDIVA/pv_game/pv_game_camera.cpp | 14 +- src/ReDIVA/pv_game/pv_game_camera.hpp | 2 +- src/ReDIVA/pv_game/pv_game_pv_data.cpp | 503 +- src/ReDIVA/pv_game/pv_game_pv_data.hpp | 12 +- src/ReDIVA/x_pv_game.cpp | 454 +- src/ReDIVA/x_pv_game.hpp | 24 +- 80 files changed, 14014 insertions(+), 11293 deletions(-) create mode 100644 src/KKdLib/prj/bit_array.hpp diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index f4f02f71..84f2778b 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -68,7 +68,7 @@ namespace Glitter { enum_or(flags, EFFECT_INST_EXT_SCALE); } - int32_t EffectInst::GetExtAnimBoneIndex(GPM, EffectExtAnimCharaNode node) { + int32_t EffectInst::GetExtAnimNodeIndex(GPM, EffectExtAnimCharaNode node) { if (node < EFFECT_EXT_ANIM_CHARA_HEAD || node > EFFECT_EXT_ANIM_CHARA_RIGHT_TOE) return -1; @@ -136,8 +136,8 @@ namespace Glitter { enum_or(flags, EFFECT_INST_EXT_ANIM_TRANS_ONLY); if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA) { - inst_ext_anim->chara_index = ext_anim->chara_index; - inst_ext_anim->bone_index = GetExtAnimBoneIndex(GPM_VAL, ext_anim->node_index); + inst_ext_anim->rob_id = ext_anim->rob_id; + inst_ext_anim->node_index = GetExtAnimNodeIndex(GPM_VAL, ext_anim->node_index); enum_or(flags, EFFECT_INST_EXT_ANIM_CHARA); inst_ext_anim->mesh_name = 0; } @@ -379,11 +379,15 @@ namespace Glitter { int32_t chara_id; if (flags & EFFECT_INST_EXT_ANIM_CHARA) { - rob_chara* rob_chr = rob_chara_array_get(ext_anim->chara_index); + RobManagement* rob_man = get_rob_management(); + if (!rob_man) + return; + + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)ext_anim->rob_id); if (!rob_chr) return; - mat4 mat = rob_chr->data.adjust_data.mat; + mat4 mat = rob_chr->rob_base.adjust.mat; vec3 scale; mat4_get_scale(&mat, &scale); @@ -391,9 +395,9 @@ namespace Glitter { ext_anim_scale.z = 0.0f; enum_or(flags, EFFECT_INST_EXT_SCALE); - int32_t bone_index = ext_anim->bone_index; - if (bone_index != -1) { - mat4* bone_mat = rob_chr->get_bone_data_mat(bone_index); + int32_t node_index = ext_anim->node_index; + if (node_index != -1) { + mat4* bone_mat = rob_chr->get_bone_data_mat(node_index); if (!bone_mat) return; @@ -430,15 +434,18 @@ namespace Glitter { mat4 mat = mat4_identity; chara_id = auth_3d_id(ext_anim->a3da_id).get_chara_id(); if (chara_id >= 0 && chara_id < ROB_ID_MAX) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); - if (rob_chr) { - mat = rob_chr->data.adjust_data.mat; + RobManagement* rob_man = get_rob_management(); + if (rob_man) { + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)ext_anim->rob_id); + if (rob_chr) { + mat = rob_chr->rob_base.adjust.mat; - vec3 scale; - mat4_get_scale(&mat, &scale); - ext_anim_scale = scale - 1.0f; - ext_anim_scale.z = 0.0f; - enum_or(flags, EFFECT_INST_EXT_SCALE); + vec3 scale; + mat4_get_scale(&mat, &scale); + ext_anim_scale = scale - 1.0f; + ext_anim_scale.z = 0.0f; + enum_or(flags, EFFECT_INST_EXT_SCALE); + } } } @@ -715,8 +722,8 @@ namespace Glitter { enum_or(flags, EFFECT_INST_EXT_ANIM_GET_THEN_UPDATE); if (ext_anim->flags & EFFECT_EXT_ANIM_CHARA) { - inst_ext_anim->chara_index = ext_anim->chara_index; - inst_ext_anim->bone_index = GetExtAnimBoneIndex(GPM_VAL, ext_anim->node_index); + inst_ext_anim->rob_id = ext_anim->rob_id; + inst_ext_anim->node_index = GetExtAnimNodeIndex(GPM_VAL, ext_anim->node_index); enum_or(flags, EFFECT_INST_EXT_ANIM_CHARA); } else { @@ -1074,11 +1081,15 @@ namespace Glitter { enum_or(flags, EFFECT_INST_EXT_ANIM_NON_INIT); if (flags & EFFECT_INST_EXT_ANIM_CHARA) { - rob_chara* rob_chr = rob_chara_array_get(ext_anim->chara_index); + RobManagement* rob_man = get_rob_management(); + if (!rob_man) + return; + + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)ext_anim->rob_id); if (!rob_chr) return; - mat4* mat = &rob_chr->data.adjust_data.mat; + mat4* mat = &rob_chr->rob_base.adjust.mat; vec3 scale; mat4_get_scale(mat, &scale); @@ -1086,14 +1097,14 @@ namespace Glitter { ext_anim_scale.z = 0.0f; enum_or(flags, EFFECT_INST_EXT_SCALE); - if (rob_chr->is_visible() || !(data.ext_anim_x->flags & EFFECT_EXT_ANIM_NO_DRAW_IF_NO_DATA)) + if (rob_chr->get_disp_flag() || !(data.ext_anim_x->flags & EFFECT_EXT_ANIM_NO_DRAW_IF_NO_DATA)) set_flags = true; else set_flags = false; - int32_t bone_index = ext_anim->bone_index; - if (bone_index != -1) { - mat4* bone_mat = rob_chr->get_bone_data_mat(bone_index); + int32_t node_index = ext_anim->node_index; + if (node_index != -1) { + mat4* bone_mat = rob_chr->get_bone_data_mat(node_index); if (bone_mat) SetExtAnim(mat, bone_mat, 0, set_flags); } @@ -1124,15 +1135,18 @@ namespace Glitter { int32_t chara_id = auth_3d_id(ext_anim->a3da_id).get_chara_id(); if (chara_id >= 0 && chara_id < ROB_ID_MAX) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); - if (rob_chr) { - mat = rob_chr->data.adjust_data.mat; + RobManagement* rob_man = get_rob_management(); + if (rob_man) { + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)ext_anim->rob_id); + if (rob_chr) { + mat = rob_chr->rob_base.adjust.mat; - vec3 scale; - mat4_get_scale(&mat, &scale); - ext_anim_scale = scale - 1.0f; - ext_anim_scale.z = 0.0f; - enum_or(flags, EFFECT_INST_EXT_SCALE); + vec3 scale; + mat4_get_scale(&mat, &scale); + ext_anim_scale = scale - 1.0f; + ext_anim_scale.z = 0.0f; + enum_or(flags, EFFECT_INST_EXT_SCALE); + } } } diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index 57cb4591..4578afe0 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -1189,14 +1189,14 @@ namespace Glitter { eff->data.ext_anim_x = ext_anim_x; if (ext_anim_x) { if (big_endian) { - ext_anim_x->chara_index = load_reverse_endianness_int32_t((void*)d); + ext_anim_x->rob_id = load_reverse_endianness_int32_t((void*)d); ext_anim_x->flags = (EffectExtAnimFlag) load_reverse_endianness_int32_t((void*)(d + 4)); ext_anim_x->node_index = (EffectExtAnimCharaNode) load_reverse_endianness_int32_t((void*)(d + 8)); } else { - ext_anim_x->chara_index = *(int32_t*)d; + ext_anim_x->rob_id = *(int32_t*)d; ext_anim_x->flags = (EffectExtAnimFlag) * (int32_t*)(d + 4); ext_anim_x->node_index = (EffectExtAnimCharaNode) * (int32_t*)(d + 8); } @@ -1367,14 +1367,14 @@ namespace Glitter { eff->data.ext_anim = ext_anim; if (ext_anim) { if (big_endian) { - ext_anim->chara_index = load_reverse_endianness_int32_t((void*)d); + ext_anim->rob_id = load_reverse_endianness_int32_t((void*)d); ext_anim->flags = (EffectExtAnimFlag) load_reverse_endianness_int32_t((void*)(d + 4)); ext_anim->node_index = (EffectExtAnimCharaNode) load_reverse_endianness_int32_t((void*)(d + 8)); } else { - ext_anim->chara_index = *(int32_t*)d; + ext_anim->rob_id = *(int32_t*)d; ext_anim->flags = (EffectExtAnimFlag) * (int32_t*)(d + 4); ext_anim->node_index = (EffectExtAnimCharaNode) * (int32_t*)(d + 8); } diff --git a/src/CRE/Glitter/file_writer.cpp b/src/CRE/Glitter/file_writer.cpp index 5cbd0c7f..63297dc9 100644 --- a/src/CRE/Glitter/file_writer.cpp +++ b/src/CRE/Glitter/file_writer.cpp @@ -789,12 +789,12 @@ namespace Glitter { enum_and(ext_anim_flag, ~EFFECT_EXT_ANIM_CHARA); if (big_endian) { - store_reverse_endianness_int32_t((void*)d, ext_anim_x->chara_index); + store_reverse_endianness_int32_t((void*)d, ext_anim_x->rob_id); store_reverse_endianness_int32_t((void*)(d + 4), ext_anim_flag); store_reverse_endianness_int32_t((void*)(d + 8), ext_anim_x->node_index); } else { - *(int32_t*)d = ext_anim_x->chara_index; + *(int32_t*)d = ext_anim_x->rob_id; *(int32_t*)(d + 4) = ext_anim_flag; *(int32_t*)(d + 8) = ext_anim_x->node_index; } @@ -913,12 +913,12 @@ namespace Glitter { enum_and(ext_anim_flag, ~EFFECT_EXT_ANIM_CHARA); if (big_endian) { - store_reverse_endianness_int32_t((void*)d, ext_anim->chara_index); + store_reverse_endianness_int32_t((void*)d, ext_anim->rob_id); store_reverse_endianness_int32_t((void*)(d + 4), ext_anim_flag); store_reverse_endianness_int32_t((void*)(d + 8), ext_anim->node_index); } else { - *(int32_t*)d = ext_anim->chara_index; + *(int32_t*)d = ext_anim->rob_id; *(int32_t*)(d + 4) = ext_anim_flag; *(int32_t*)(d + 8) = ext_anim->node_index; } diff --git a/src/CRE/Glitter/glitter.cpp b/src/CRE/Glitter/glitter.cpp index 68689e0c..b22876e2 100644 --- a/src/CRE/Glitter/glitter.cpp +++ b/src/CRE/Glitter/glitter.cpp @@ -121,7 +121,7 @@ namespace Glitter { PIVOT_TOP_LEFT, }; - const char* effect_ext_anim_index_name[] = { + const char* effect_ext_anim_rob_id_name[] = { "P1", "P2", "P3", diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index eb666026..ed66e7e7 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -473,7 +473,7 @@ namespace Glitter { extern const ParticleBlendMask particle_blend_mask_default; extern const Pivot pivot_reverse[]; - extern const char* effect_ext_anim_index_name[]; + extern const char* effect_ext_anim_rob_id_name[]; extern const char* effect_ext_anim_node_index_name[]; extern const char* effect_type_name[]; extern const char* emitter_name[]; @@ -657,7 +657,7 @@ namespace Glitter { char mesh_name[0x80]; }; struct { - int32_t chara_index; + int32_t rob_id; EffectExtAnimCharaNode node_index; }; }; @@ -673,7 +673,7 @@ namespace Glitter { char mesh_name[0x80]; }; struct { - int32_t chara_index; + int32_t rob_id; EffectExtAnimCharaNode node_index; }; }; @@ -943,7 +943,7 @@ namespace Glitter { void SetExtColor(float_t r, float_t g, float_t b, float_t a, bool set); void SetExtScale(float_t scale); - static int32_t GetExtAnimBoneIndex(GPM, EffectExtAnimCharaNode node); + static int32_t GetExtAnimNodeIndex(GPM, EffectExtAnimCharaNode node); }; class EffectInstF2 : public EffectInst { @@ -959,8 +959,8 @@ namespace Glitter { const char* mesh_name; }; struct { - int32_t chara_index; - int32_t bone_index; + int32_t rob_id; + int32_t node_index; }; }; mat4 mat; @@ -1023,8 +1023,8 @@ namespace Glitter { const char* mesh_name; }; struct { - int32_t chara_index; - int32_t bone_index; + int32_t rob_id; + int32_t node_index; }; }; mat4 mat; diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 3365d0dc..2dae811c 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -2232,7 +2232,7 @@ namespace Glitter { int32_t tex_trans_count = 0; for (texture_transform_struct& i : tex_trans) { - tex_trans->id = hash_murmurhash_empty; + tex_trans->texid = hash_murmurhash_empty; tex_trans->mat = mat4_identity; } @@ -2242,7 +2242,7 @@ namespace Glitter { if (i.tex_index == hash_murmurhash_empty || i.tex_index == hash_murmurhash_null) continue; - tex_trans[tex_trans_count].id = i.tex_index; + tex_trans[tex_trans_count].texid = i.tex_index; tex_trans[tex_trans_count].mat = mat4_identity; tex_trans_count++; diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index e7421503..69601b3b 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -118,6 +118,7 @@ static void auth_3d_camera_root_view_point_store(auth_3d* auth, auth_3d_camera_r auth_3d_camera_root_view_point_file* crvpf); static void auth_3d_chara_disp(auth_3d_chara* c, auth_3d* auth, render_context* rctx); static void auth_3d_chara_load(auth_3d* auth, auth_3d_chara* c, auth_3d_chara_file* cf); +static void auth_3d_chara_set(auth_3d_chara* c, auth_3d* auth, render_context* rctx); static void auth_3d_chara_store(auth_3d* auth, auth_3d_chara* c, auth_3d_chara_file* cf); static void auth_3d_curve_load(auth_3d* auth, auth_3d_curve* c, auth_3d_curve_file* cf); static void auth_3d_curve_store(auth_3d* auth, auth_3d_curve* c, auth_3d_curve_file* cf); @@ -231,15 +232,13 @@ static size_t auth_3d_time_event_radix_index_func_frame(auth_3d_time_event* data auth_3d_data_struct* auth_3d_data; auth_3d_detail::TaskAuth3d* task_auth_3d; -bool auth_3d_chara_visible = true; - static int16_t auth_3d_load_counter; static auth_3d_detail::FrameRateTimeStop frame_rate_time_stop; extern render_context* rctx_ptr; auth_3d::auth_3d() : uid(), id(), mat(), enable(), camera_root_update(), visible(), repeat(), field_C(), ended(), -left_right_reverse(), once(), alpha(), chara_id(), chara_item(), shadow(), reflect(), pos(), frame_rate(), frame(), +mirror(), once(), alpha(), rob_id(), chara_item(), shadow(), reflect(), pos(), frame_rate(), frame(), req_frame(), max_frame(), frame_changed(), frame_offset(), last_frame(), paused(), event_time_next() { hash = hash_murmurhash_empty; src_chara = CN_MAX; @@ -331,6 +330,9 @@ void auth_3d::ctrl(render_context* rctx) { post_process.interpolate(frame); auth_3d_post_process_set(&post_process, rctx); + for (auth_3d_chara& i : chara) + auth_3d_chara_set(&i, this, rctx); + auth_3d_time_event* i_event = event_time_next; auth_3d_time_event* i_event_end = event_time.data() + event_time.size(); for (; i_event != i_event_end && frame >= i_event->frame; i_event++) { @@ -370,7 +372,7 @@ void auth_3d::ctrl(render_context* rctx) { cam.fov = i.fov_value; cam.roll = i.roll_value; - if (left_right_reverse) { + if (mirror) { cam.interest.x = -cam.interest.x; cam.view_point.x = -cam.view_point.x; cam.roll = -cam.roll; @@ -806,12 +808,12 @@ void auth_3d::reset() { repeat = false; field_C = false; ended = false; - left_right_reverse = false; + mirror = false; once = false; mat = mat4_identity; alpha = 1.0f; obj_flags = mdl::OBJ_ALPHA_ORDER_POST_GLITTER; - chara_id = -1; + rob_id = ROB_ID_NULL; chara_item = false; shadow = false; reflect = false; @@ -1204,7 +1206,7 @@ namespace auth_3d_detail { auth_3d_point& point = auth->point[index]; vec3 pos = point.model_transform.translation_value; - if (auth->left_right_reverse) + if (auth->mirror) pos.x = -pos.x; mat4_transform_point(&auth->mat, &pos, &pos); @@ -1243,10 +1245,10 @@ namespace auth_3d_detail { if (cam || !auth->chara.size() || index >= auth->chara.size()) return; - int32_t chr_index = auth->chara[index].index; - rob_chara* rob_chr = rob_chara_array_get(chr_index); + ROB_ID rob_id = (ROB_ID)auth->chara[index].rob_id; + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (rob_chr) - rob_chr->field_C = true; + rob_chr->disp_pos_reset = true; } void EventFXSmoothCut::End(auth_3d* auth, int32_t flags, render_context* rctx) { @@ -1312,18 +1314,18 @@ namespace auth_3d_detail { void EventFilterTimeStop::Begin(auth_3d* auth, int32_t flags, render_context* rctx) { for (auth_3d_chara& i : auth->chara) { - rob_chara* rob_chr = rob_chara_array_get(i.index); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i.rob_id); if (rob_chr) - rob_chr->rob_disp->disable_update = true; + rob_chr->disp->disable_update = true; } effect_manager_set_frame_rate_control(&frame_rate_time_stop); } void EventFilterTimeStop::End(auth_3d* auth, int32_t flags, render_context* rctx) { for (auth_3d_chara& i : auth->chara) { - rob_chara* rob_chr = rob_chara_array_get(i.index); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i.rob_id); if (rob_chr) - rob_chr->rob_disp->disable_update = true; + rob_chr->disp->disable_update = true; } effect_manager_set_frame_rate_control(get_sys_frame_rate()); } @@ -1377,7 +1379,7 @@ namespace auth_3d_detail { } - static void sub_140532980(int32_t chara_id, const char* name) { + static void sub_140532980(ROB_ID rob_id, const char* name) { } @@ -1386,12 +1388,12 @@ namespace auth_3d_detail { if (begin > frame || frame >= end || ((flags & 0x02) && fabsf(frame - begin) > 0.1f)) return; - int32_t index = -1; + ROB_ID rob_id = ROB_ID_NULL; if (auth->chara.size()) - index = auth->chara.front().index; + rob_id = (ROB_ID)auth->chara.front().rob_id; - if (index >= 0 && index < ROB_ID_MAX) - sub_140532980(index, param1.c_str()); + if (rob_id >= 0 && rob_id < ROB_ID_MAX) + sub_140532980(rob_id, param1.c_str()); else if (sound_work_has_property(param1.c_str())) sound_work_play_se(1, param1.c_str()); } @@ -1738,7 +1740,7 @@ void auth_3d_camera_root_view_point::reset() { roll.reset(); } -auth_3d_chara::auth_3d_chara() : index() { +auth_3d_chara::auth_3d_chara() : rob_id() { reset(); } @@ -1754,7 +1756,7 @@ void auth_3d_chara::reset() { model_transform.reset(); name.clear(); name.shrink_to_fit(); - index = -1; + rob_id = ROB_ID_NULL; } auth_3d_curve::auth_3d_curve() : value() { @@ -2643,9 +2645,9 @@ int32_t auth_3d_id::get_chara_id() { if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; if (auth->id == id) - return auth->chara_id; + return auth->rob_id; } - return -1; + return ROB_ID_NULL; } bool auth_3d_id::get_enable() { @@ -2693,11 +2695,11 @@ float_t auth_3d_id::get_last_frame() { return 0.0f; } -bool auth_3d_id::get_left_right_reverse() { +bool auth_3d_id::get_mirror() { if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; if (auth->id == id) - return auth->left_right_reverse; + return auth->mirror; } return false; } @@ -2785,7 +2787,7 @@ void auth_3d_id::set_chara_id(int32_t value) { if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; if (auth->id == id) - auth->chara_id = value; + auth->rob_id = value; } } @@ -2794,7 +2796,7 @@ void auth_3d_id::set_chara_num(size_t auth_chara_id, int32_t index) { auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; if (auth->id == id) if (auth_chara_id < auth->chara.size()) - auth->chara[auth_chara_id].index = index; + auth->chara[auth_chara_id].rob_id = index; } } @@ -2833,14 +2835,6 @@ void auth_3d_id::set_last_frame(float_t value) { } } -void auth_3d_id::set_left_right_reverse(bool value) { - if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { - auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; - if (auth->id == id) - auth->left_right_reverse = value; - } -} - void auth_3d_id::set_mat(const mat4& value) { if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; @@ -2857,6 +2851,14 @@ void auth_3d_id::set_max_frame(float_t value) { } } +void auth_3d_id::set_mirror(bool value) { + if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { + auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; + if (auth->id == id) + auth->mirror = value; + } +} + void auth_3d_id::set_paused(bool value) { if (id >= 0 && ((id & 0x7FFF) < AUTH_3D_DATA_COUNT)) { auth_3d* auth = &auth_3d_data->data[id & 0x7FFF]; @@ -3201,18 +3203,6 @@ void auth_3d_data_free() { } } -void auth_3d_check_chara_visible(int32_t chara_id, const struct rob_chara_pv_data* pv_data) { - data_struct* aft_data = &data_list[DATA_AFT]; - bone_database* aft_bone_data = &aft_data->data_ft.bone_data; - motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - - rob_chara_array_get(chara_id)->reset_data(pv_data, aft_bone_data, aft_mot_db); - if (rob_chara_array_check_visibility(0) || rob_chara_array_check_visibility(1)) - auth_3d_chara_visible = true; - else - auth_3d_chara_visible = false; -} - void task_auth_3d_init() { if (!task_auth_3d) task_auth_3d = new auth_3d_detail::TaskAuth3d; @@ -4411,8 +4401,8 @@ static void auth_3d_camera_root_view_point_store(auth_3d* auth, auth_3d_camera_r } static void auth_3d_chara_disp(auth_3d_chara* c, auth_3d* auth, render_context* rctx) { - if (c->index <= ROB_ID_MAX) - rob_chara_array_set_visibility(c->index, c->model_transform.visible); + if (c->rob_id >= 0 && c->rob_id <= ROB_ID_MAX) + get_rob_management()->set_disp_on((ROB_ID)c->rob_id, c->model_transform.visible); if (auth->pos) { c->model_transform.set_mat(&auth->mat); @@ -4425,6 +4415,29 @@ static void auth_3d_chara_load(auth_3d* auth, auth_3d_chara* c, auth_3d_chara_fi c->name.assign(cf->name); } +static void auth_3d_chara_set(auth_3d_chara* c, auth_3d* auth, render_context* rctx) { + mat4 mat = auth->mat; + + vec3 pos = c->model_transform.translation_value; + if (auth->mirror) + pos.x = -pos.x; + mat4_transform_point(&mat, &pos, &pos); + + RobAngle chr_ang; + chr_ang.set_rad(c->model_transform.rotation_value.y); + if (auth->mirror) + chr_ang = -chr_ang; + + RobAngle ang; + ang.set_rad(atan2f(mat.row2.x, mat.row2.z)); + ang += chr_ang; + if (c->rob_id >= 0 && c->rob_id < ROB_ID_MAX) { + RobManagement* rob_man = get_rob_management(); + rob_man->set_rob_pos((ROB_ID)c->rob_id, pos); + rob_man->set_rob_yang((ROB_ID)c->rob_id, ang); + } +} + static void auth_3d_chara_store(auth_3d* auth, auth_3d_chara* c, auth_3d_chara_file* cf) { auth_3d_model_transform_store(auth, &c->model_transform, &cf->model_transform); cf->name.assign(c->name); @@ -6533,16 +6546,17 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context object_database* obj_db = auth->obj_db; texture_database* tex_db = auth->tex_db; - if (auth->chara_id >= 0 && auth->chara_id < ROB_ID_MAX) { - if (rob_chara_pv_data_array_check_chara_id(auth->chara_id)) { - rob_chara* rob_chr = rob_chara_array_get(auth->chara_id); + if (auth->rob_id >= 0 && auth->rob_id < ROB_ID_MAX) { + RobManagement* rob_man = get_rob_management(); + if (rob_man->is_init((ROB_ID)auth->rob_id)) { + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)auth->rob_id); mat4 m; - mat4_mul(&rob_chr->data.position.rob_mat, + mat4_mul(&rob_chr->rob_base.position.rob_mat, auth->chara_item - ? &rob_chr->data.adjust_data.item_mat - : &rob_chr->data.adjust_data.mat, &m); + ? &rob_chr->rob_base.adjust.item_mat + : &rob_chr->rob_base.adjust.mat, &m); mat4_mul(&mat, &m, &mat); - disp_manager.set_shadow_group(auth->chara_id ? SHADOW_GROUP_STAGE : SHADOW_GROUP_CHARA); + disp_manager.set_shadow_group(auth->rob_id ? SHADOW_GROUP_STAGE : SHADOW_GROUP_CHARA); } } @@ -6558,7 +6572,7 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context char buf[0x80]; int32_t tex_pat_count = 0; - texture_pattern_struct tex_pat[TEXTURE_PATTERN_COUNT]; + TexChange tex_pat[TEXTURE_PATTERN_COUNT]; for (auth_3d_object_texture_pattern& i : o->texture_pattern) { if (!i.pattern.curve || i.name.size() <= 3) @@ -6569,8 +6583,8 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context sprintf_s(buf, sizeof(buf), "%.*s%03d", (int32_t)(i.name.size() - 3), i.name.c_str(), (int32_t)prj::roundf(i.pattern.value)); - tex_pat[tex_pat_count].src = texture_id(0x00, i.texture_id); - tex_pat[tex_pat_count].dst = texture_id(0x00, tex_db->get_texture_id(buf)); + tex_pat[tex_pat_count].org_texid = texture_id(0x00, i.texture_id); + tex_pat[tex_pat_count].change_texid = texture_id(0x00, tex_db->get_texture_id(buf)); tex_pat_count++; } @@ -6585,7 +6599,7 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context || !texture_manager_get_texture(i.texture_id)) continue; - tex_trans[tex_trans_count].id = i.texture_id; + tex_trans[tex_trans_count].texid = i.texture_id; tex_trans[tex_trans_count].mat = i.mat; tex_trans_count++; } @@ -6830,14 +6844,15 @@ static void auth_3d_object_hrc_disp(auth_3d_object_hrc* oh, auth_3d* auth, rende disp_manager.set_shadow_group(SHADOW_GROUP_CHARA); mat4 mat = mat4_identity; - if (auth->chara_id >= 0 && auth->chara_id < ROB_ID_MAX) { - if (rob_chara_pv_data_array_check_chara_id(auth->chara_id)) { - rob_chara* rob_chr = rob_chara_array_get(auth->chara_id); - mat4_mul(&rob_chr->data.position.rob_mat, + if (auth->rob_id >= 0 && auth->rob_id < ROB_ID_MAX) { + RobManagement* rob_man = get_rob_management(); + if (rob_man->is_init((ROB_ID)auth->rob_id)) { + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)auth->rob_id); + mat4_mul(&rob_chr->rob_base.position.rob_mat, auth->chara_item - ? &rob_chr->data.adjust_data.item_mat - : &rob_chr->data.adjust_data.mat, &mat); - if (auth->chara_id) + ? &rob_chr->rob_base.adjust.item_mat + : &rob_chr->rob_base.adjust.mat, &mat); + if (auth->rob_id) disp_manager.set_shadow_group(SHADOW_GROUP_STAGE); } } diff --git a/src/CRE/auth_3d.hpp b/src/CRE/auth_3d.hpp index 857e6bb4..1be1c996 100644 --- a/src/CRE/auth_3d.hpp +++ b/src/CRE/auth_3d.hpp @@ -481,7 +481,7 @@ struct auth_3d_camera_root { struct auth_3d_chara { auth_3d_model_transform model_transform; std::string name; - int32_t index; + int32_t rob_id; auth_3d_chara(); ~auth_3d_chara(); @@ -865,7 +865,7 @@ struct auth_3d_id { float_t get_frame(); float_t get_frame_offset(); float_t get_last_frame(); - bool get_left_right_reverse(); + bool get_mirror(); bool get_paused(); float_t get_play_control_begin(); float_t get_play_control_size(); @@ -881,9 +881,9 @@ struct auth_3d_id { void set_enable(bool value); void set_frame_rate(FrameRateControl* value); void set_last_frame(float_t value); - void set_left_right_reverse(bool value); void set_mat(const mat4& value); void set_max_frame(float_t value); + void set_mirror(bool value); void set_paused(bool value); void set_pos(int32_t value); void set_reflect(bool value); @@ -928,12 +928,12 @@ struct auth_3d { bool repeat; bool field_C; bool ended; - bool left_right_reverse; + bool mirror; bool once; mat4 mat; float_t alpha; mdl::ObjFlags obj_flags; - int32_t chara_id; + int32_t rob_id; bool chara_item; bool shadow; bool reflect; @@ -1074,8 +1074,6 @@ extern void auth_3d_data_unload_category(const char* category_name); extern void auth_3d_data_unload_category(uint32_t category_hash); extern void auth_3d_data_free(); -extern void auth_3d_check_chara_visible(int32_t chara_id, const struct rob_chara_pv_data* pv_data); - extern void task_auth_3d_init(); extern bool task_auth_3d_add_task(); extern bool task_auth_3d_check_task_ready(); diff --git a/src/CRE/customize_item_table.cpp b/src/CRE/customize_item_table.cpp index 0fadd61d..a0b0847e 100644 --- a/src/CRE/customize_item_table.cpp +++ b/src/CRE/customize_item_table.cpp @@ -38,10 +38,10 @@ struct customize_item_data_handler { ~customize_item_data_handler(); void add_all_customize_items(); - void get_chara_item(const std::string& name, CHARA_NUM& chara_num, int32_t& item_no); + void get_chara_item(const std::string& name, CHARA_NUM& chara_num, uint32_t& item_no); void add_customize_items(); bool get_customize_item(int32_t id, customize_item_data& data); - int32_t get_customize_item_obj_id(int32_t id); + uint32_t get_customize_item_obj_id(int32_t id); }; customize_item_table_handler* customize_item_table_handler_data; @@ -120,7 +120,7 @@ void customize_item_data_handler_data_add_all_customize_items() { } void customize_item_table_handler_data_get_chara_item( - const std::string& name, CHARA_NUM& chara_num, int32_t& item_no) { + const std::string& name, CHARA_NUM& chara_num, uint32_t& item_no) { customize_item_data_handler_data->get_chara_item(name, chara_num, item_no); } @@ -128,7 +128,7 @@ bool customize_item_data_handler_data_get_customize_item(int32_t id, customize_i return customize_item_data_handler_data->get_customize_item(id, data); } -int32_t customize_item_data_handler_data_get_customize_item_obj_id(int32_t id) { +uint32_t customize_item_data_handler_data_get_customize_item_obj_id(int32_t id) { return customize_item_data_handler_data->get_customize_item_obj_id(id); } @@ -316,7 +316,7 @@ void customize_item_data_handler::add_all_customize_items() { } void customize_item_data_handler::get_chara_item( - const std::string& name, CHARA_NUM& chara_num, int32_t& item_no) { + const std::string& name, CHARA_NUM& chara_num, uint32_t& item_no) { size_t pos = name.find('_'); if (pos < 6) return; @@ -326,7 +326,7 @@ void customize_item_data_handler::get_chara_item( if (!_item_no) return; - item_no = _item_no; + item_no = (uint32_t)_item_no; std::string chara(name.substr(0, 3)); if (chara.compare("CMN")) @@ -394,7 +394,7 @@ bool customize_item_data_handler::get_customize_item(int32_t id, customize_item_ return false; } -int32_t customize_item_data_handler::get_customize_item_obj_id(int32_t id) { +uint32_t customize_item_data_handler::get_customize_item_obj_id(int32_t id) { for (customize_item_data& i : customize_items) if (i.id == id) return i.obj_id; diff --git a/src/CRE/customize_item_table.hpp b/src/CRE/customize_item_table.hpp index 8bdbc9cf..e5e18912 100644 --- a/src/CRE/customize_item_table.hpp +++ b/src/CRE/customize_item_table.hpp @@ -55,7 +55,7 @@ extern void customize_item_table_handler_data_free(); extern void customize_item_data_handler_data_init(); extern void customize_item_data_handler_data_add_all_customize_items(); extern void customize_item_table_handler_data_get_chara_item( - const std::string& name, CHARA_NUM& chara_num, int32_t& item_no); + const std::string& name, CHARA_NUM& chara_num, uint32_t& item_no); extern bool customize_item_data_handler_data_get_customize_item(int32_t id, customize_item_data& data); -extern int32_t customize_item_data_handler_data_get_customize_item_obj_id(int32_t id); +extern uint32_t customize_item_data_handler_data_get_customize_item_obj_id(int32_t id); extern void customize_item_data_handler_data_free(); diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 9c5b55d3..8c9e2f44 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -435,17 +435,11 @@ struct ripple_emit_draw_data { ripple_emit_draw_data(); }; -struct struc_192 { - int32_t index; - vec3 pos; +struct RippleRobColli { + ROB_COLLI_ID colli_id; + vec3 old_pos; - struc_192(); -}; - -struct struc_207 { - struc_192 field_0[18]; - - struc_207(); + RippleRobColli(); }; struct EffectRipple { @@ -480,8 +474,8 @@ struct EffectRipple { ripple_emit_draw_data field_178; ripple_emit_draw_data field_2A0; ripple_emit_draw_data field_3C8; - int32_t field_4F0; - struc_207 field_4F4[6]; + int32_t num_rob_colli; + RippleRobColli rob_colli[ROB_ID_MAX][18]; int32_t field_BB4; RenderTexture ripple_texture; int32_t counter; @@ -590,15 +584,16 @@ struct splash_particle { void restart(); }; -struct ParticleEmitter { - splash_particle* splash; - vec3 pos; - int32_t field_1C; - float_t field_20; - int field_24; - float_t field_28; - float_t particle_size; +class ParticleEmitter { +friend class ParticleEmitterRob; +private: + splash_particle* m_particle_set; + vec3 m_pos; + vec3 m_dir; + float_t m_initial_life; + float_t m_initial_size; +public: ParticleEmitter(); virtual ~ParticleEmitter(); @@ -608,19 +603,21 @@ struct ParticleEmitter { void reset_data(); }; -struct ParticleEmitterRob : ParticleEmitter { - int32_t chara_id; - int32_t bone_index; - vec3 prev_pos; - vec3 velocity; - vec3 prev_velocity; - int32_t emit_num; - float_t field_60; - float_t emission_ratio_attn; - float_t emission_velocity_scale; - bool in_water; - bool init_trans; +class ParticleEmitterRob : public ParticleEmitter { +private: + ROB_ID m_rob_id; + ROB_COLLI_ID m_colli_id; + vec3 m_old_pos; + vec3 m_velocity; + vec3 m_old_velocity; + int32_t m_emit_num; + float_t m_emission_ratio; + float_t m_emission_ratio_attn; + float_t m_emission_velocity_scale; + bool m_flag_in_water; + bool m_set_old_pos; +public: ParticleEmitterRob(); virtual ~ParticleEmitterRob() override; @@ -631,7 +628,12 @@ struct ParticleEmitterRob : ParticleEmitter { void get_trans(); void reset_data(); void reset_data_base(); - void set_chara(int32_t chara_id, int32_t bone_index, bool in_water); + void set_chara(ROB_ID rob_id, ROB_COLLI_ID colli_id, bool in_water); + void set_emit_num(int32_t value); + void set_emission_ratio_attn(float_t value); + void set_emission_velocity_scale(float_t value); + void set_initial_life(float_t value); + void set_initial_size(float_t value); void set_splash(splash_particle* value); }; @@ -2595,12 +2597,13 @@ float_t EffectFogRing::ptcl_random(float_t value) { void EffectFogRing::sub_140347B40(float_t delta_time) { field_124 = 0; + RobManagement* rob_man = get_rob_management(); struc_573(*v5)[5] = field_5C; - for (int32_t i = 0; i < 2; i++, v5++) { - if (!rob_chara_array_get(i) || !rob_chara_array_check_visibility(i)) + for (int32_t i = 0; i <= ROB_ID_2P; i++, v5++) { + if (!rob_man->get_rob((ROB_ID)i) || !rob_man->get_disp_on((ROB_ID)i)) continue; - rob_chara_bone_data* rob_bone_data = rob_chara_array_get_bone_data(i); + rob_chara_bone_data* rob_bone_data = get_rob_management()->get_rob_motion_work((ROB_ID)i); if (!rob_bone_data) continue; @@ -3185,12 +3188,8 @@ ripple_emit_draw_data::ripple_emit_draw_data() : data() { } -struc_192::struc_192() { - index = -1; -} - -struc_207::struc_207() { - +RippleRobColli::RippleRobColli() { + colli_id = ROB_COLLI_ID_DUMMY; } EffectRipple::Params::Params() { @@ -3203,7 +3202,7 @@ EffectRipple::Params::Params() { EffectRipple::EffectRipple() : delta_frame(), update(), rain_ripple_num(), rain_ripple_min_value(), rain_ripple_max_value(), field_14(), emit_pos_scale(), emit_pos_ofs_x(), emit_pos_ofs_z(), ripple_tex_id(), use_float_ripplemap(), field_30(), rob_emitter_size(), emitter_num(), emitter_size(), field_4C(), field_50(), -field_178(), field_2A0(), field_3C8(), field_4F0(), field_BB4(), counter(), field_BEC(), stage_set() { +field_178(), field_2A0(), field_3C8(), num_rob_colli(), field_BB4(), counter(), field_BEC(), stage_set() { ground_y = -1001.0f; emitter_list = 0; current_stage_index = -1; @@ -3356,10 +3355,10 @@ void EffectRipple::draw(render_data_context& rend_data_ctx, const cam_data& cam) } void EffectRipple::reset() { - field_4F0 = 18; - for (struc_207& i : field_4F4) - for (int32_t j = 0; j < field_4F0; j++) - i.field_0[j].pos = 0.0f; + num_rob_colli = 18; + for (auto& i : rob_colli) + for (int32_t j = 0; j < num_rob_colli; j++) + i[j].old_pos = 0.0f; field_30 = 60; @@ -3387,8 +3386,12 @@ void EffectRipple::set_stage_index(int32_t stage_index) { } void EffectRipple::set_stage_indices(const std::vector& stage_indices) { - static const int32_t dword_1409E5330[] = { - 0, 1, 2, 4, 10, 5, 12, 7, 14, 9, 21, 15, 23, 17, 25, 19, 26, 20 + static const ROB_COLLI_ID ripple_colli_id[] = { + ROB_COLLI_ID_KOSHI, ROB_COLLI_ID_MUNE_L, ROB_COLLI_ID_MUNE_R, ROB_COLLI_ID_KAO, + ROB_COLLI_ID_KATA_L1, ROB_COLLI_ID_KATA_R1, ROB_COLLI_ID_UDE_L1, ROB_COLLI_ID_UDE_R1, + ROB_COLLI_ID_TE_L, ROB_COLLI_ID_TE_R, ROB_COLLI_ID_MOMO_L1, ROB_COLLI_ID_MOMO_R1, + ROB_COLLI_ID_SUNE_L1, ROB_COLLI_ID_SUNE_R1, + ROB_COLLI_ID_ASI_L, ROB_COLLI_ID_ASI_R, ROB_COLLI_ID_TOE_L, ROB_COLLI_ID_TOE_R }; stage_set = false; @@ -3423,11 +3426,11 @@ void EffectRipple::set_stage_indices(const std::vector& stage_indices) rctx_ptr->render_manager->set_pass_sw(rndr::RND_PASSID_PRE_PROCESS, true); rctx_ptr->render_manager->add_pre_process(0, EffectRipple::draw_static, this); - field_4F0 = 18; - for (struc_207& i : field_4F4) - for (int32_t j = 0; j < field_4F0; j++) { - i.field_0[j].index = dword_1409E5330[j]; - i.field_0[j].pos = 0.0f; + num_rob_colli = 18; + for (auto& i : rob_colli) + for (int32_t j = 0; j < num_rob_colli; j++) { + i[j].colli_id = ripple_colli_id[j]; + i[j].old_pos = 0.0f; } update = false; @@ -3601,26 +3604,26 @@ void EffectRipple::sub_14035AED0() { ripple_emit_draw_data& v2 = field_178; ripple_emit_draw_data& v3 = field_2A0; - int32_t chara_id = 0; - for (struc_207& i : field_4F4) { - if (!rob_chara_array_check_visibility(chara_id)) { - chara_id++; + int32_t rob_id = 0; + for (auto& i : rob_colli) { + if (!get_rob_management()->get_disp_on((ROB_ID)rob_id)) { + rob_id++; continue; } - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)rob_id); if (!rob_chr) { - chara_id++; + rob_id++; continue; } - for (int32_t j = 0; j < field_4F0; j++) { - struc_192& v4 = i.field_0[j]; + for (int32_t j = 0; j < num_rob_colli; j++) { + RippleRobColli& rob_colli = i[j]; vec3 pos = 0.0f; - float_t scale = rob_chr->get_pos_scale(v4.index, pos); + float_t scale = rob_chr->get_pos_scale(rob_colli.colli_id, pos); if (pos.y - ground_y < scale) { if (use_float_ripplemap) - sub_1403587C0(pos, v4.pos, scale, v2.data, v3.data); + sub_1403587C0(pos, rob_colli.old_pos, scale, v2.data, v3.data); else if (v2.data.count < 16) { v2.data.position[v2.data.count].x = ((rand_state_array_get_float(4) - 0.5f) * 0.02f + pos.x) * emit_pos_scale + emit_pos_ofs_x; @@ -3631,10 +3634,10 @@ void EffectRipple::sub_14035AED0() { v2.data.count++; } } - v4.pos = pos; + rob_colli.old_pos = pos; } - chara_id++; + rob_id++; } if (use_float_ripplemap) { @@ -3934,8 +3937,7 @@ void splash_particle::restart() { alive = 0; } -ParticleEmitter::ParticleEmitter() : splash(), field_1C(), -field_20(), field_24(), field_28(), particle_size() { +ParticleEmitter::ParticleEmitter() : m_particle_set(), m_initial_life(), m_initial_size() { reset_data(); } @@ -3952,17 +3954,16 @@ void ParticleEmitter::restart() { } void ParticleEmitter::reset_data() { - splash = 0; - pos = 0.0f; - field_1C = 0; - field_20 = 1.0f; - field_24 = 0; - particle_size = 1.0f; - field_28 = 1.0f; + m_particle_set = 0; + m_pos = 0.0f; + m_dir = { 0.0f, 1.0f, 0.0f }; + m_initial_life = 1.0f; + m_initial_size = 1.0f; } -ParticleEmitterRob::ParticleEmitterRob() : chara_id(), bone_index(), emit_num(), -field_60(), emission_ratio_attn(), emission_velocity_scale(), in_water(), init_trans() { +ParticleEmitterRob::ParticleEmitterRob() : m_rob_id(), m_colli_id(), +m_emit_num(), m_emission_ratio(), m_emission_ratio_attn(), +m_emission_velocity_scale(), m_flag_in_water(), m_set_old_pos() { reset_data(); } @@ -3995,53 +3996,56 @@ static inline vec3 rand_b_get_float() { } void ParticleEmitterRob::ctrl(float_t delta_time) { - if (fabsf(delta_time) <= 0.000001f || !splash - || !rob_chara_array_get(chara_id) || !rob_chara_array_check_visibility(chara_id)) + if (fabsf(delta_time) <= 0.000001f || !m_particle_set) + return; + + RobManagement* rob_man = get_rob_management(); + if (!rob_man->get_rob(m_rob_id) || !rob_man->get_disp_on(m_rob_id)) return; get_trans(); get_velocity(delta_time); - float_t v8 = vec3::length(velocity); + float_t v8 = vec3::length(m_velocity); if (v8 > 100.0f) return; - if (pos.y >= 0.3f) - field_60 = max_def(field_60 - delta_time * emission_ratio_attn, 0.0f); + if (m_pos.y >= 0.3f) + m_emission_ratio = max_def(m_emission_ratio - delta_time * m_emission_ratio_attn, 0.0f); else - field_60 = 1.0f; + m_emission_ratio = 1.0f; if (v8 < 1.0f) return; float_t v27 = min_def(v8 * 0.05f, 1.0f); - int32_t emit_num = (int32_t)((float_t)this->emit_num * (v27 * v27) * field_60); + int32_t emit_num = (int32_t)((float_t)m_emit_num * (v27 * v27) * m_emission_ratio); if (emit_num <= 0) return; - vec3 prev_velocity = this->prev_velocity * emission_velocity_scale; - vec3 velocity = this->velocity * emission_velocity_scale; - vec3 trans_diff = pos - prev_pos; - vec3 velocity_diff = velocity - prev_velocity; + vec3 old_velocity = m_old_velocity * m_emission_velocity_scale; + vec3 velocity = m_velocity * m_emission_velocity_scale; + vec3 pos_diff = m_pos - m_old_pos; + vec3 velocity_diff = velocity - m_old_velocity; float_t v41 = flt_140C9A588; for (int32_t i = 0; i < emit_num; i++) { - splash_particle_data* ptcl = splash->emit(); + splash_particle_data* ptcl = m_particle_set->emit(); if (!ptcl) break; float_t diff_scale = rand_a_get_float(); vec3 rand_vec = rand_b_get_float(); - ptcl->position = rand_vec * 0.05f + (trans_diff * diff_scale + prev_pos); - ptcl->direction = rand_vec * 0.65f + (velocity_diff * diff_scale + prev_velocity); + ptcl->position = rand_vec * 0.05f + (pos_diff * diff_scale + m_old_pos); + ptcl->direction = rand_vec * 0.65f + (velocity_diff * diff_scale + old_velocity); float_t size_scale = rand_a_get_float(); ptcl->flags = 0x01; - ptcl->size = max_def(size_scale * size_scale * particle_size, 1.0f); + ptcl->size = max_def(size_scale * size_scale * m_initial_size, 1.0f); - if (in_water && (trans_diff.y * diff_scale) + prev_pos.y < 0.3f) { + if (m_flag_in_water && (pos_diff.y * diff_scale) + m_old_pos.y < 0.3f) { ptcl->flags = 0x00; ptcl->size += v41; ptcl->direction.y += 0.8f; @@ -4056,69 +4060,89 @@ void ParticleEmitterRob::ctrl(float_t delta_time) { } void ParticleEmitterRob::restart() { - velocity = 0.0f; - prev_velocity = 0.0f; - init_trans = true; - field_60 = 0.0f; + m_velocity = 0.0f; + m_old_velocity = 0.0f; + m_set_old_pos = true; + m_emission_ratio = 0.0f; } void ParticleEmitterRob::get_trans() { vec3 pos; - rob_chara_array_get(chara_id)->get_pos_scale(bone_index, pos); + get_rob_management()->get_rob(m_rob_id)->get_pos_scale(m_colli_id, pos); - if (init_trans) { - prev_pos = pos; - init_trans = false; + if (m_set_old_pos) { + m_old_pos = pos; + m_set_old_pos = false; } else - prev_pos = this->pos; + m_old_pos = m_pos; - this->pos = pos; + m_pos = pos; } void ParticleEmitterRob::get_velocity(float_t delta_time) { - prev_velocity = velocity; - velocity = (pos - prev_pos) * (1.0f / delta_time); + m_old_velocity = m_velocity; + m_velocity = (m_pos - m_old_pos) * (1.0f / delta_time); } void ParticleEmitterRob::reset_data() { - bone_index = -1; - chara_id = 0; - prev_pos = 0.0f; - velocity = 0.0f; - prev_velocity = 0.0f; - emit_num = 0; - field_60 = 0.0f; - emission_ratio_attn = 0.0f; - emission_velocity_scale = 0.0f; - in_water = true; - init_trans = true; + m_rob_id = (ROB_ID)0; + m_colli_id = ROB_COLLI_ID_DUMMY; + m_old_pos = 0.0f; + m_velocity = 0.0f; + m_old_velocity = 0.0f; + m_emit_num = 0; + m_emission_ratio = 0.0f; + m_emission_ratio_attn = 0.0f; + m_emission_velocity_scale = 0.0f; + m_flag_in_water = true; + m_set_old_pos = true; } void ParticleEmitterRob::reset_data_base() { ParticleEmitter::reset_data(); } -void ParticleEmitterRob::set_chara(int32_t chara_id, int32_t bone_index, bool in_water) { +void ParticleEmitterRob::set_chara(ROB_ID rob_id, ROB_COLLI_ID colli_id, bool in_water) { reset_data_base(); reset_data(); - this->chara_id = chara_id; - this->bone_index = bone_index; - prev_pos = 0.0f; - velocity = 0.0f; - prev_velocity = 0.0f; - emit_num = 0; - field_60 = 0.0f; - emission_ratio_attn = 0.2f; - emission_velocity_scale = 0.08f; - this->in_water = in_water; - init_trans = true; + m_rob_id = rob_id; + m_colli_id = colli_id; + m_old_pos = 0.0f; + m_velocity = 0.0f; + m_old_velocity = 0.0f; + m_emit_num = 0; + m_emission_ratio = 0.0f; + m_emission_ratio_attn = 0.2f; + m_emission_velocity_scale = 0.08f; + m_flag_in_water = in_water; + m_set_old_pos = true; } +void ParticleEmitterRob::set_emit_num(int32_t value) { + m_emit_num = value; +} + +void ParticleEmitterRob::set_emission_ratio_attn(float_t value) { + m_emission_ratio_attn = value; +} + +void ParticleEmitterRob::set_emission_velocity_scale(float_t value) { + m_emission_velocity_scale = value; +} + +void ParticleEmitterRob::set_initial_life(float_t value) { + m_initial_life = value; +} + +void ParticleEmitterRob::set_initial_size(float_t value) { + m_initial_size = value; +} + void ParticleEmitterRob::set_splash(splash_particle* value) { - splash = value; + m_particle_set = value; } water_particle_vertex_data::water_particle_vertex_data() : size() { @@ -4419,11 +4443,12 @@ void EffectSplashParticle::disp() { } bool EffectSplashParticle::init(int32_t splash_tex_id, object_info splash_obj_id, bool in_water, bool blink) { - static const int32_t dword_1409E59A8[5] = { - 26, 20, 14, 9, 0, + static const ROB_COLLI_ID splash_colli_id[] = { + ROB_COLLI_ID_TOE_L, ROB_COLLI_ID_TOE_R, + ROB_COLLI_ID_TE_L, ROB_COLLI_ID_TE_R, ROB_COLLI_ID_KOSHI, }; - static const int32_t dword_1409E59A8_size = sizeof(dword_1409E59A8) / sizeof(int32_t); + static const int32_t splash_colli_id_count = sizeof(splash_colli_id) / sizeof(BONE_ID); splash_count = 1; splash = new splash_particle[splash_count]; @@ -4431,7 +4456,7 @@ bool EffectSplashParticle::init(int32_t splash_tex_id, object_info splash_obj_id if (!splash) return false; - emitter_rob_count = dword_1409E59A8_size * ROB_ID_MAX; + emitter_rob_count = splash_colli_id_count * ROB_ID_MAX; emitter_rob = new ParticleEmitterRob[emitter_rob_count]; if (!emitter_rob) @@ -4446,10 +4471,10 @@ bool EffectSplashParticle::init(int32_t splash_tex_id, object_info splash_obj_id for (int32_t i = 0; i < splash_count; i++) splash[i].init(5000); - for (int32_t i = 0, j = 0; i < ROB_ID_MAX; i++) - for (const int32_t& l : dword_1409E59A8) { + for (int32_t rob_id = 0, j = 0; rob_id < ROB_ID_MAX; rob_id++) + for (const ROB_COLLI_ID colli_id : splash_colli_id) { ParticleEmitterRob& ptcl_emit_rob = emitter_rob[j++]; - ptcl_emit_rob.set_chara(i, l, in_water); + ptcl_emit_rob.set_chara((ROB_ID)rob_id, colli_id, in_water); ptcl_emit_rob.set_splash(splash); } @@ -4461,20 +4486,20 @@ bool EffectSplashParticle::init(int32_t splash_tex_id, object_info splash_obj_id if (splash_obj_id.not_null()) { splash_object.init(100); - object_emitter_rob_count = dword_1409E59A8_size * ROB_ID_MAX; + object_emitter_rob_count = splash_colli_id_count * ROB_ID_MAX; object_emitter_rob = new ParticleEmitterRob[object_emitter_rob_count]; if (!object_emitter_rob) return false; - for (int32_t i = 0, j = 0; i < ROB_ID_MAX; i++) - for (const int32_t& l : dword_1409E59A8) { + for (int32_t rob_id = 0, j = 0; rob_id < ROB_ID_MAX; rob_id++) + for (const ROB_COLLI_ID colli_id : splash_colli_id) { ParticleEmitterRob& ptcl_emit_rob = object_emitter_rob[j++]; - ptcl_emit_rob.set_chara(i, l, in_water); + ptcl_emit_rob.set_chara((ROB_ID)rob_id, colli_id, in_water); ptcl_emit_rob.set_splash(&splash_object); - ptcl_emit_rob.emit_num = 10; - ptcl_emit_rob.particle_size = 1.0f; - ptcl_emit_rob.field_28 = 1.0f; + ptcl_emit_rob.set_emit_num(10); + ptcl_emit_rob.set_initial_life(1.0f); + ptcl_emit_rob.set_initial_size(1.0f); } particle_disp_obj.init(&splash_object, splash_obj_id); @@ -4546,22 +4571,22 @@ void EffectSplashParticle::set_color(const vec4& value) { void EffectSplashParticle::set_emission_ratio_attn(float_t value) { for (int32_t i = 0; i < emitter_rob_count; i++) - emitter_rob[i].emission_ratio_attn = value; + emitter_rob[i].set_emission_ratio_attn(value); if (has_splash_object) for (int32_t i = 0; i < object_emitter_rob_count; i++) - object_emitter_rob[i].emission_ratio_attn = value; + object_emitter_rob[i].set_emission_ratio_attn(value); emission_ratio_attn = value; } void EffectSplashParticle::set_emission_velocity_scale(float_t value) { for (int32_t i = 0; i < emitter_rob_count; i++) - emitter_rob[i].emission_velocity_scale = value; + emitter_rob[i].set_emission_velocity_scale(value); if (has_splash_object) for (int32_t i = 0; i < object_emitter_rob_count; i++) - object_emitter_rob[i].emission_velocity_scale = value; + object_emitter_rob[i].set_emission_velocity_scale(value); emission_velocity_scale = value; } @@ -4570,7 +4595,7 @@ void EffectSplashParticle::set_emit_num(int32_t value) { emit_num = value; for (int32_t i = 0; i < emitter_rob_count; i++) - emitter_rob[i].emit_num = value; + emitter_rob[i].set_emit_num(value); } void EffectSplashParticle::set_particle_size(float_t value) { @@ -4580,7 +4605,7 @@ void EffectSplashParticle::set_particle_size(float_t value) { water_ptcl[i].particle_size = value; for (int32_t i = 0; i < emitter_rob_count; i++) - emitter_rob[i].particle_size = value; + emitter_rob[i].set_initial_size(value); } void EffectSplashParticle::set_ripple_emission(float_t value) { diff --git a/src/CRE/hand_item.cpp b/src/CRE/hand_item.cpp index be986381..6dbe5e6f 100644 --- a/src/CRE/hand_item.cpp +++ b/src/CRE/hand_item.cpp @@ -8,6 +8,7 @@ #include "../KKdLib/database/object.hpp" #include "../KKdLib/io/path.hpp" #include "../KKdLib/str_utils.hpp" +#include "rob/rob.hpp" #include "data.hpp" #include "file_handler.hpp" #include "mdata_manager.hpp" @@ -32,11 +33,11 @@ struct hand_item_handler { static void hand_item_load(const object_database* obj_db, std::map, hand_item>& hand_items, hnd_itm& hnd_itm_file); -static int32_t mtp_hand_array_get_mottbl_index(const char* str); +static uint32_t mtp_hand_array_get_mottbl_type(const char* str); hand_item_handler* hand_item_handler_data; -hand_item::hand_item() : file_size(), hand_mottbl_index(), hand_scale(), uid() { +hand_item::hand_item() : file_size(), mottbl_type(), scale(), uid() { } @@ -174,43 +175,43 @@ static void hand_item_load(const object_database* obj_db, itm.item_str.assign(i.item_str); itm.item_name.assign(i.item_name); itm.file_size = i.file_size; - itm.hand_scale = i.hand_scale; + itm.scale = i.hand_scale; itm.uid = i.uid; - uint32_t hand_motion_id = mtp_hand_array_get_mottbl_index(i.hand_motion.c_str()); - if (hand_motion_id == -1) + uint32_t mottbl_type = mtp_hand_array_get_mottbl_type(i.hand_motion.c_str()); + if (mottbl_type == MTP_NONE) continue; - itm.hand_mottbl_index = hand_motion_id; + itm.mottbl_type = mottbl_type; hand_items.insert({ { itm.uid, CN_NONE }, itm }); } } -static int32_t mtp_hand_array_get_mottbl_index(const char* str) { - static const std::pair mtp_hand_array[] = { - { "MTP_HAND_NULL" , 0xC0 }, - { "MTP_HAND_RESET" , 0xC1 }, - { "MTP_HAND_NORMAL" , 0xC2 }, - { "MTP_HAND_OPEN" , 0xC3 }, - { "MTP_HAND_CLOSE" , 0xC4 }, - { "MTP_HAND_PEACE" , 0xC5 }, - { "MTP_HAND_GOOD" , 0xC6 }, - { "MTP_HAND_ONE" , 0xC7 }, - { "MTP_HAND_THREE" , 0xC8 }, - { "MTP_HAND_NEGI" , 0xC9 }, - { "MTP_HAND_SIZEN" , 0xCA }, - { "MTP_HAND_PICK" , 0xCB }, - { "MTP_HAND_MIC" , 0xCC }, - { "MTP_HAND_FAN" , 0xCD }, - { "MTP_HAND_BOTTLE" , 0xCE }, - { "MTP_HAND_PHONE" , 0xCF }, - { "MTP_HAND_HOLD" , 0xD0 }, - { "MTP_HAND_FLASHLIGHT", 0xD1 }, - { "MTP_HAND_MIC_BLK" , 0xD2 }, - { "MTP_HAND_MIC_SLV" , 0xD3 }, - { "MTP_HAND_CUPICE" , 0xD4 }, - { "MTP_HAND_ICEBAR" , 0xD5 }, - { 0 , 0 }, +static uint32_t mtp_hand_array_get_mottbl_type(const char* str) { + static const std::pair mtp_hand_array[] = { + { "MTP_HAND_NULL" , MTP_HAND_NULL }, + { "MTP_HAND_RESET" , MTP_HAND_RESET }, + { "MTP_HAND_NORMAL" , MTP_HAND_NORMAL }, + { "MTP_HAND_OPEN" , MTP_HAND_OPEN }, + { "MTP_HAND_CLOSE" , MTP_HAND_CLOSE }, + { "MTP_HAND_PEACE" , MTP_HAND_PEACE }, + { "MTP_HAND_GOOD" , MTP_HAND_GOOD }, + { "MTP_HAND_ONE" , MTP_HAND_ONE }, + { "MTP_HAND_THREE" , MTP_HAND_THREE }, + { "MTP_HAND_NEGI" , MTP_HAND_NEGI }, + { "MTP_HAND_SIZEN" , MTP_HAND_SIZEN }, + { "MTP_HAND_PICK" , MTP_HAND_PICK }, + { "MTP_HAND_MIC" , MTP_HAND_MIC }, + { "MTP_HAND_FAN" , MTP_HAND_FAN }, + { "MTP_HAND_BOTTLE" , MTP_HAND_BOTTLE }, + { "MTP_HAND_PHONE" , MTP_HAND_PHONE }, + { "MTP_HAND_HOLD" , MTP_HAND_HOLD }, + { "MTP_HAND_FLASHLIGHT", MTP_HAND_FLASHLIGHT }, + { "MTP_HAND_MIC_BLK" , MTP_HAND_MIC_BLK }, + { "MTP_HAND_MIC_SLV" , MTP_HAND_MIC_SLV }, + { "MTP_HAND_CUPICE" , MTP_HAND_CUPICE }, + { "MTP_HAND_ICEBAR" , MTP_HAND_ICEBAR }, + { 0 , MTP_NONE }, }; auto mtp_hand = mtp_hand_array; diff --git a/src/CRE/hand_item.hpp b/src/CRE/hand_item.hpp index bd8769b0..2bde355f 100644 --- a/src/CRE/hand_item.hpp +++ b/src/CRE/hand_item.hpp @@ -17,8 +17,8 @@ struct hand_item { std::string item_str; std::string item_name; uint32_t file_size; - uint32_t hand_mottbl_index; - float_t hand_scale; + uint32_t mottbl_type; + float_t scale; int32_t uid; hand_item(); diff --git a/src/CRE/item_table.cpp b/src/CRE/item_table.cpp index b6fe81f7..95f45a79 100644 --- a/src/CRE/item_table.cpp +++ b/src/CRE/item_table.cpp @@ -7,6 +7,7 @@ #include "../KKdLib/io/memory_stream.hpp" #include "../KKdLib/io/path.hpp" #include "../KKdLib/str_utils.hpp" +#include "rob/rob.hpp" #include "data.hpp" #include "file_handler.hpp" #include "mdata_manager.hpp" @@ -16,54 +17,58 @@ struct item_table_handler { std::list file_handlers; bool ready; const char* file; - item_table table; + RobItemHeader table; item_table_handler(); ~item_table_handler(); void clear(); - const item_table_item* get_item(int32_t item_no); + const RobItemTable* get_item(uint32_t item_no); bool load(); void parse(p_file_handler* pfhndl); void read(); void set_path(CHARA_NUM chara_num); }; -static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& itm_tbl_file); +static void item_table_load(data_struct* data, RobItemHeader& itm_tbl, itm_table& itm_tbl_file); item_table_handler* item_table_handler_array; -item_table_item_data_obj::item_table_item_data_obj() : rpk() { +RobItemDataObj::RobItemDataObj() : replace_id() { } -item_table_item_data_ofs::item_table_item_data_ofs() : sub_id(), no() { +RobItemDataOfs::RobItemDataOfs() : equip_sub_id(), item_no() { } -item_table_item_data_tex::item_table_item_data_tex() { - org = -1; - chg = -1; +RobItemDataTex::RobItemDataTex() { + org_uid = -1; + chg_uid = -1; } -item_table_item_data_col::item_table_item_data_col() : flag() { - tex_id = -1; +RobItemDataCol::RobItemDataCol() : flag() { + tex_uid = -1; } -item_table_item_data::item_table_item_data() { +RobItemData::RobItemData() { } -item_table_item_data::~item_table_item_data() { +RobItemData::~RobItemData() { } -item_table_item::item_table_item() : flag(), type(), attr(), des_id(), -sub_id(), exclusion(), point(), org_itm(), npr_flag(), face_depth() { +RobItemTable::RobItemTable() : flag(), type(), attr(), equip_des_id(), +equip_sub_id(), exclusion(), point(), org_itm(), npr_flag(), face_depth() { } -item_table_item::~item_table_item() { +RobItemTable::~RobItemTable() { + +} + +RobItemEquip::RobItemEquip() : item_no() { } @@ -75,17 +80,17 @@ item_table_dbgset::~item_table_dbgset() { } -item_table::item_table() { +RobItemHeader::RobItemHeader() { } -item_table::~item_table() { +RobItemHeader::~RobItemHeader() { } -const item_table_item* item_table::get_item(int32_t item_no) { - auto elem = item.find(item_no); - if (elem != item.end() && elem->second.type != -1) +const RobItemTable* RobItemHeader::get_item(uint32_t item_no) { + auto elem = table.find(item_no); + if (elem != table.end() && elem->second.type != ROB_ITEM_TYPE_NONE) return &elem->second; return 0; } @@ -96,47 +101,44 @@ void item_table_handler_array_init() { item_table_handler_array[i].set_path((CHARA_NUM)i); } -const item_cos_data* item_table_handler_array_get_item_cos_data(CHARA_NUM cn, int32_t cos_id) { - const item_table* table = item_table_handler_array_get_table(cn); - if (!table) +const RobItemEquip* get_default_costume_data(CHARA_NUM cn, int32_t cos_id) { + const RobItemHeader* tbl = get_rob_item_header(cn); + if (!tbl) return 0; - auto elem = table->cos.find(cos_id); - if (elem != table->cos.end()) + auto elem = tbl->defset.find(cos_id); + if (elem != tbl->defset.end()) return &elem->second; - else if (table->cos.size()) - return &table->cos.begin()->second; + else if (tbl->defset.size()) + return &tbl->defset.begin()->second; return 0; } -const item_table_item* item_table_handler_array_get_item(CHARA_NUM cn, int32_t item_no) { +const RobItemTable* get_rob_item_table(CHARA_NUM cn, uint32_t item_no) { if (cn >= 0 && cn < CN_MAX) return item_table_handler_array[cn].get_item(item_no); return 0; } -std::string item_table_handler_array_get_item_name(CHARA_NUM cn, int32_t item_no) { - const item_table_item* item = item_table_handler_array_get_item(cn, item_no); - if (item) - return item->name; +std::string get_rob_item_table_name(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) { + std::string name = RobItem::s_check_ng_item_name(cn, item_no); + if (name.size()) + return name; + return tbl->name; + } return {}; } -item_sub_id item_table_handler_array_get_item_sub_id(CHARA_NUM cn, int32_t item_no) { - const item_table_item* item = item_table_handler_array_get_item(cn, item_no); - if (item) - return item->sub_id; - return ITEM_SUB_NONE; -} - -const std::vector* item_table_handler_array_get_item_objset(CHARA_NUM cn, int32_t item_no) { - const item_table_item* item = item_table_handler_array_get_item(cn, item_no); - if (item) - return &item->objset; +const std::vector* get_rob_item_table_objset(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return &tbl->objset; return 0; } -const item_table* item_table_handler_array_get_table(CHARA_NUM cn) { +const RobItemHeader* get_rob_item_header(CHARA_NUM cn) { if (cn < 0 || cn >= CN_MAX) return 0; return &item_table_handler_array[cn].table; @@ -176,7 +178,7 @@ void item_table_handler::clear() { ready = false; } -const item_table_item* item_table_handler::get_item(int32_t item_no) { +const RobItemTable* item_table_handler::get_item(uint32_t item_no) { return table.get_item(item_no); } @@ -254,13 +256,13 @@ void item_table_handler::set_path(CHARA_NUM chara_num) { this->file = item_table_paths[chara_num]; } -static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& itm_tbl_file) { +static void item_table_load(data_struct* data, RobItemHeader& itm_tbl, itm_table& itm_tbl_file) { object_database* aft_obj_db = &data->data_ft.obj_db; texture_database* aft_tex_db = &data->data_ft.tex_db; for (itm_table_item& i : itm_tbl_file.item) { - item_table_item itm; - itm.flag = i.flag; + RobItemTable itm; + itm.flag.w = i.flag.w; itm.name.assign(i.name); itm.objset.reserve(i.objset.size()); @@ -272,54 +274,54 @@ static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& i itm.type = i.type; itm.attr = i.attr; - itm.des_id = i.des_id; - itm.sub_id = (item_sub_id)i.sub_id; + itm.equip_des_id = i.equip_des_id; + itm.equip_sub_id = i.equip_sub_id; for (itm_table_item_data_obj& j : i.data.obj) { - object_info obj_info; + object_info uid; if (j.uid.compare("NULL")) { - obj_info = aft_obj_db->get_object_info(j.uid.c_str()); - if (obj_info.is_null()) + uid = aft_obj_db->get_object_info(j.uid.c_str()); + if (uid.is_null()) continue; } - item_table_item_data_obj obj; - obj.obj_info = obj_info; - obj.rpk = j.rpk; + RobItemDataObj obj; + obj.uid = uid; + obj.replace_id = j.rpk; itm.data.obj.push_back(obj); } for (itm_table_item_data_ofs& j : i.data.ofs) { - item_table_item_data_ofs ofs; - ofs.sub_id = j.sub_id; - ofs.no = j.no; - ofs.position = j.position; - ofs.rotation = j.rotation; + RobItemDataOfs ofs; + ofs.equip_sub_id = j.sub_id; + ofs.item_no = j.item_no; + ofs.trans = j.trans; + ofs.rot = j.rot; ofs.scale = j.scale; itm.data.ofs.push_back(ofs); } for (itm_table_item_data_tex& j : i.data.tex) { - uint32_t org = aft_tex_db->get_texture_id(j.org.c_str()); - uint32_t chg = aft_tex_db->get_texture_id(j.chg.c_str()); - if (org == -1 || chg == -1) + uint32_t org_uid = aft_tex_db->get_texture_id(j.org.c_str()); + uint32_t chg_uid = aft_tex_db->get_texture_id(j.chg.c_str()); + if (org_uid == -1 || chg_uid == -1) continue; - item_table_item_data_tex tex; - tex.org = org; - tex.chg = chg; + RobItemDataTex tex; + tex.org_uid = org_uid; + tex.chg_uid = chg_uid; itm.data.tex.push_back(tex); } for (itm_table_item_data_col& j : i.data.col) { - uint32_t tex_id = aft_tex_db->get_texture_id(j.tex.c_str()); - if (tex_id == -1) + uint32_t tex_uid = aft_tex_db->get_texture_id(j.tex.c_str()); + if (tex_uid == -1) continue; - item_table_item_data_col col; - col.tex_id = tex_id; - col.flag = j.flag; - col.col_tone = j.col_tone; + RobItemDataCol col; + col.tex_uid = tex_uid; + col.flag.w = j.flag.w; + col.color = j.color; itm.data.col.push_back(col); } @@ -328,23 +330,23 @@ static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& i itm.org_itm = i.org_itm; itm.npr_flag = i.npr_flag; itm.face_depth = i.face_depth; - itm_tbl.item.push_back(i.no, itm); + itm_tbl.table.push_back(i.no, itm); } - itm_tbl.item.combine(); + itm_tbl.table.combine(); for (itm_table_dbgset& i : itm_tbl_file.dbgset) { if (aft_obj_db->get_object_set_id(i.name.c_str()) == -1) continue; - item_cos_data cos = {}; + RobItemEquip equip = {}; for (int32_t j : i.item) { - const item_table_item* item = itm_tbl.get_item(j); - if (item) - cos.arr[item->sub_id] = j; + const RobItemTable* tbl = itm_tbl.get_item(j); + if (tbl) + equip.item_no[tbl->equip_sub_id] = j; } - itm_tbl.dbgset.push_back(i.name, cos); + itm_tbl.dbgset.push_back(i.name, equip); } itm_tbl.dbgset.combine(); @@ -353,15 +355,15 @@ static void item_table_load(data_struct* data, item_table& itm_tbl, itm_table& i if (!i.item.size()) continue; - item_cos_data cos = {}; + RobItemEquip equip = {}; for (int32_t j : i.item) { - const item_table_item* item = itm_tbl.get_item(j); - if (item) - cos.arr[item->sub_id] = j; + const RobItemTable* tbl = itm_tbl.get_item(j); + if (tbl) + equip.item_no[tbl->equip_sub_id] = j; } - itm_tbl.cos.push_back(i.id, cos); + itm_tbl.defset.push_back(i.id, equip); } - itm_tbl.cos.push_back(499, {}); - itm_tbl.cos.combine(); + itm_tbl.defset.push_back(499, {}); + itm_tbl.defset.combine(); } diff --git a/src/CRE/item_table.hpp b/src/CRE/item_table.hpp index 431c5af3..92318f1a 100644 --- a/src/CRE/item_table.hpp +++ b/src/CRE/item_table.hpp @@ -12,96 +12,94 @@ #include "object.hpp" #include "texture.hpp" -struct item_table_item_data_obj { - object_info obj_info; - ROB_PARTS_KIND rpk; +struct RobItemDataObj { + object_info uid; + ROB_PARTS_KIND replace_id; - item_table_item_data_obj(); + RobItemDataObj(); }; -struct item_table_item_data_ofs { - item_sub_id sub_id; - int32_t no; - vec3 position; - vec3 rotation; +struct RobItemDataOfs { + ROB_ITEM_EQUIP_SUB_ID equip_sub_id; + uint32_t item_no; + vec3 trans; + vec3 rot; vec3 scale; - item_table_item_data_ofs(); + RobItemDataOfs(); }; -struct item_table_item_data_tex { - uint32_t org; - uint32_t chg; +struct RobItemDataTex { + uint32_t org_uid; + uint32_t chg_uid; - item_table_item_data_tex(); + RobItemDataTex(); }; -struct item_table_item_data_col { - uint32_t tex_id; - int32_t flag; - color_tone col_tone; - - item_table_item_data_col(); +struct RobItemDataColFlagMember { + uint32_t is_available : 1; + uint32_t reserve : 31; }; -struct item_table_item_data { - std::vector obj; - std::vector ofs; - std::vector tex; - std::vector col; - - item_table_item_data(); - ~item_table_item_data(); +union RobItemDataColFlag { + uint32_t w; + RobItemDataColFlagMember m; }; -struct item_table_item { - int32_t flag; +struct RobItemDataCol { + uint32_t tex_uid; + RobItemDataColFlag flag; + ImgfColorToneParam color; + + RobItemDataCol(); +}; + +struct RobItemData { + std::vector obj; + std::vector ofs; + std::vector tex; + std::vector col; + + RobItemData(); + ~RobItemData(); +}; + +struct RobItemTableFlagMember { + uint32_t is_dummy : 1; + uint32_t is_present : 1; + uint32_t is_texorg : 1; + uint32_t is_objorg : 1; + uint32_t reserve : 28; +}; + +union RobItemTableFlag { + uint32_t w; + RobItemTableFlagMember m; +}; + +struct RobItemTable { + RobItemTableFlag flag; std::string name; std::vector objset; - int32_t type; - int32_t attr; - int32_t des_id; - item_sub_id sub_id; - item_table_item_data data; - int32_t exclusion; - int32_t point; - int32_t org_itm; + ROB_ITEM_TYPE type; + uint32_t attr; + ROB_ITEM_EQUIP_DES_ID equip_des_id; + ROB_ITEM_EQUIP_SUB_ID equip_sub_id; + RobItemData data; + uint32_t exclusion; + uint32_t point; + uint32_t org_itm; bool npr_flag; float_t face_depth; - item_table_item(); - ~item_table_item(); + RobItemTable(); + ~RobItemTable(); }; -union item_cos_data { - struct { - int32_t zujo; - int32_t kami; - int32_t hitai; - int32_t me; - int32_t megane; - int32_t mimi; - int32_t kuchi; - int32_t maki; - int32_t kubi; - int32_t inner; - int32_t outer; - int32_t joha_mae; - int32_t joha_ushiro; - int32_t hada; - int32_t kata; - int32_t u_ude; - int32_t l_ude; - int32_t te; - int32_t belt; - int32_t cosi; - int32_t pants; - int32_t asi; - int32_t sune; - int32_t kutsu; - int32_t head; - } data; - int32_t arr[ITEM_SUB_MAX]; +struct RobItemEquip { + uint32_t item_no[ROB_ITEM_EQUIP_SUB_ID_MAX]; + + RobItemEquip(); }; struct item_table_dbgset { @@ -109,24 +107,24 @@ struct item_table_dbgset { ~item_table_dbgset(); }; -struct item_table { - prj::vector_pair_combine item; - prj::vector_pair_combine cos; - prj::vector_pair_combine dbgset; +struct RobItemHeader { + prj::vector_pair_combine table; + prj::vector_pair_combine defset; + prj::vector_pair_combine dbgset; - item_table(); - ~item_table(); + RobItemHeader(); + ~RobItemHeader(); - const item_table_item* get_item(int32_t item_no); + const RobItemTable* get_item(uint32_t item_no); }; extern void item_table_handler_array_init(); -extern const item_cos_data* item_table_handler_array_get_item_cos_data(CHARA_NUM cn, int32_t cos_id); -extern const item_table_item* item_table_handler_array_get_item(CHARA_NUM cn, int32_t item_no); -extern std::string item_table_handler_array_get_item_name(CHARA_NUM cn, int32_t item_no); -extern item_sub_id item_table_handler_array_get_item_sub_id(CHARA_NUM cn, int32_t item_no); -extern const std::vector* item_table_handler_array_get_item_objset(CHARA_NUM cn, int32_t item_no); -extern const item_table* item_table_handler_array_get_table(CHARA_NUM cn); extern bool item_table_handler_array_load(); extern void item_table_handler_array_read(); extern void item_table_handler_array_free(); + +extern const RobItemEquip* get_default_costume_data(CHARA_NUM cn, int32_t cos_id); +extern const RobItemHeader* get_rob_item_header(CHARA_NUM cn); +extern const RobItemTable* get_rob_item_table(CHARA_NUM cn, uint32_t item_no); +extern std::string get_rob_item_table_name(CHARA_NUM cn, uint32_t item_no); +extern const std::vector* get_rob_item_table_objset(CHARA_NUM cn, uint32_t item_no); diff --git a/src/CRE/light_param/wind.cpp b/src/CRE/light_param/wind.cpp index f232a41d..475e826f 100644 --- a/src/CRE/light_param/wind.cpp +++ b/src/CRE/light_param/wind.cpp @@ -4,11 +4,12 @@ */ #include "wind.hpp" -#include "../rob/rob.hpp" #include "../app_system_detail.hpp" TaskWind* task_wind; +extern bool pv_osage_manager_array_get_disp(); + Wind::Wind() : scale(), cycle(), yrot(), zrot(), bias(), spectrum(), val(), frame(), strength() { count = 16; diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index 57ef40c1..5c6613b9 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -51,20 +51,21 @@ material_list_struct::material_list_struct(uint32_t hash, vec4& blend_color, } -texture_pattern_struct::texture_pattern_struct() { +TexChange::TexChange() { } -texture_pattern_struct::texture_pattern_struct(texture_id src, texture_id dst) : src(src), dst(dst) { +TexChange::TexChange(texture_id org_texid, texture_id change_texid) + : org_texid(org_texid), change_texid(change_texid) { } texture_transform_struct::texture_transform_struct() { - id = (uint32_t)-1; + texid = (uint32_t)-1; mat = mat4_identity; } -texture_transform_struct::texture_transform_struct(uint32_t id, const mat4& mat) : id(id), mat(mat) { +texture_transform_struct::texture_transform_struct(uint32_t texid, const mat4& mat) : texid(texid), mat(mat) { } @@ -2833,14 +2834,16 @@ namespace mdl { } void DispManager::entry_obj_by_object_info_object_skin(object_info obj_info, - const std::vector* texture_pattern, + const std::vector* texture_pattern, const RobSkinCol* skin_col, float_t alpha, const mat4* matrices, const mat4* ex_data_matrices, const mat4* mat, const mat4& global_mat) { obj_skin* skin = objset_info_storage_get_obj_skin(obj_info); if (!skin) return; - obj_skin_set_matrix_buffer(skin, matrices, ex_data_matrices, rctx_ptr->matrix_buffer, mat, global_mat); + static mat4 env_mtx[MATRIX_BUFFER_COUNT]; + + obj_skin_set_matrix_buffer(skin, matrices, ex_data_matrices, env_mtx, mat, global_mat); vec4 blend_color; vec4 offset_color; @@ -2874,9 +2877,9 @@ namespace mdl { set_texture_pattern((int32_t)texture_pattern_count, texture_pattern->data()); if (fabsf(alpha - 1.0f) > 0.000001f) - entry_obj_by_object_info(global_mat, obj_info, alpha, rctx_ptr->matrix_buffer); + entry_obj_by_object_info(global_mat, obj_info, alpha, env_mtx); else - entry_obj_by_object_info(global_mat, obj_info, rctx_ptr->matrix_buffer); + entry_obj_by_object_info(global_mat, obj_info, env_mtx); if (texture_pattern && texture_pattern_count) set_texture_pattern(); @@ -2995,7 +2998,7 @@ namespace mdl { value = texture_color_offset; } - void DispManager::get_texture_pattern(int32_t& count, texture_pattern_struct*& value) { + void DispManager::get_texture_pattern(int32_t& count, TexChange*& value) { count = texture_pattern_count; for (int32_t i = 0; i < count; i++) @@ -3253,7 +3256,7 @@ namespace mdl { texture_color_offset = value; } - void DispManager::set_texture_pattern(int32_t count, const texture_pattern_struct* value) { + void DispManager::set_texture_pattern(int32_t count, const TexChange* value) { if (count > TEXTURE_PATTERN_COUNT) return; diff --git a/src/CRE/mdl/disp_manager.hpp b/src/CRE/mdl/disp_manager.hpp index 9e57c7b5..a6faa1d1 100644 --- a/src/CRE/mdl/disp_manager.hpp +++ b/src/CRE/mdl/disp_manager.hpp @@ -40,20 +40,20 @@ struct material_list_struct { vec4u8& has_blend_color, vec4& emission, vec4u8& has_emission); }; -struct texture_pattern_struct { - texture_id src; - texture_id dst; +struct TexChange { + texture_id org_texid; + texture_id change_texid; - texture_pattern_struct(); - texture_pattern_struct(texture_id src, texture_id dst); + TexChange(); + TexChange(texture_id org_texid, texture_id change_texid); }; struct texture_transform_struct { - uint32_t id; + uint32_t texid; mat4 mat; texture_transform_struct(); - texture_transform_struct(uint32_t id, const mat4& mat); + texture_transform_struct(uint32_t texid, const mat4& mat); }; struct morph_struct { @@ -203,7 +203,7 @@ namespace mdl { size_t morph_vertex_buffer_offset; float_t morph_weight; int32_t texture_pattern_count; - texture_pattern_struct texture_pattern_array[TEXTURE_PATTERN_COUNT]; + TexChange texture_pattern_array[TEXTURE_PATTERN_COUNT]; vec4 texture_color_coefficients; vec4 texture_color_offset; vec4 texture_specular_coefficients; @@ -505,7 +505,7 @@ namespace mdl { void* buff; morph_struct morph; int32_t texture_pattern_count; - texture_pattern_struct texture_pattern_array[TEXTURE_PATTERN_COUNT]; + TexChange texture_pattern_array[TEXTURE_PATTERN_COUNT]; vec4 texture_color_coefficients; vec4 texture_color_offset; vec4 texture_specular_coefficients; @@ -565,7 +565,7 @@ namespace mdl { bool entry_obj_by_object_info_instanced(object_info obj_info, const std::vector& instances, float_t r, float_t g, float_t b, float_t a); void entry_obj_by_object_info_object_skin(object_info obj_info, - const std::vector* texture_pattern, + const std::vector* texture_pattern, const RobSkinCol* skin_col, float_t alpha, const mat4* matrices, const mat4* ex_data_matrices, const mat4* mat, const mat4& global_mat); void entry_obj_etc(const mat4& mat, const EtcObj& etc); @@ -582,7 +582,7 @@ namespace mdl { SHADOW_GROUP get_shadow_group(); void get_texture_color_coeff(vec4& value); void get_texture_color_offset(vec4& value); - void get_texture_pattern(int32_t& count, texture_pattern_struct*& value); + void get_texture_pattern(int32_t& count, TexChange*& value); void get_texture_specular_coeff(vec4& value); void get_texture_specular_offset(vec4& value); void get_texture_transform(int32_t& count, texture_transform_struct*& value); @@ -605,7 +605,7 @@ namespace mdl { void set_shadow_group(SHADOW_GROUP value = SHADOW_GROUP_CHARA); void set_texture_color_coefficients(const vec4& value); void set_texture_color_offset(const vec4& value); - void set_texture_pattern(int32_t count = 0, const texture_pattern_struct* value = 0); + void set_texture_pattern(int32_t count = 0, const TexChange* value = 0); void set_texture_specular_coefficients(const vec4& value); void set_texture_specular_offset(const vec4& value); void set_texture_transform(int32_t count = 0, const texture_transform_struct* value = 0); diff --git a/src/CRE/mdl/draw_object.cpp b/src/CRE/mdl/draw_object.cpp index f46494f7..b16a5202 100644 --- a/src/CRE/mdl/draw_object.cpp +++ b/src/CRE/mdl/draw_object.cpp @@ -318,8 +318,8 @@ namespace mdl { if (texture_id != -1) { for (int32_t j = 0; j < args->texture_pattern_count; j++) - if (args->texture_pattern_array[j].src == ::texture_id(0x00, texture_id)) { - texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].dst); + if (args->texture_pattern_array[j].org_texid == ::texture_id(0x00, texture_id)) { + texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].change_texid); if (tex) tex_id = tex->glid; break; @@ -592,8 +592,8 @@ static void draw_object_material_set_cheap( GLuint tex_id = -1; for (int32_t j = 0; j < args->texture_pattern_count; j++) - if (args->texture_pattern_array[j].src == ::texture_id(0x00, texture_id)) { - texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].dst); + if (args->texture_pattern_array[j].org_texid == ::texture_id(0x00, texture_id)) { + texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].change_texid); if (tex) tex_id = tex->glid; break; @@ -681,8 +681,8 @@ static void draw_object_material_set_default(render_data_context& rend_data_ctx, GLuint tex_id = -1; uint32_t texture_id = texdata->tex_index; for (int32_t j = 0; j < args->texture_pattern_count; j++) - if (args->texture_pattern_array[j].src == ::texture_id(0x00, texture_id)) { - texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].dst); + if (args->texture_pattern_array[j].org_texid == ::texture_id(0x00, texture_id)) { + texture* tex = texture_manager_get_texture(args->texture_pattern_array[j].change_texid); if (tex) tex_id = tex->glid; break; @@ -1012,7 +1012,7 @@ static void draw_object_vertex_attrib_set_cheap( mats[0] = material->material.texdata[0].tex_coord_mat; if (material->material.texdata[0].shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) for (int32_t j = 0; j < args->texture_transform_count; j++) - if (args->texture_transform_array[j].id == tex_index) { + if (args->texture_transform_array[j].texid == tex_index) { mats[0] = args->texture_transform_array[j].mat; break; } @@ -1074,7 +1074,7 @@ static void draw_object_vertex_attrib_set_default( mats[texcoord_index] = texdata->tex_coord_mat; if (texdata->shader_info.m.tex_type == OBJ_MATERIAL_TEXTURE_COLOR) for (int32_t k = 0; k < args->texture_transform_count; k++) - if (args->texture_transform_array[k].id == texture_id) { + if (args->texture_transform_array[k].texid == texture_id) { mats[texcoord_index] = args->texture_transform_array[k].mat; texcoord_mat_set[texcoord_index] = true; break; diff --git a/src/CRE/pv_db.cpp b/src/CRE/pv_db.cpp index e5366b10..e1bc904c 100644 --- a/src/CRE/pv_db.cpp +++ b/src/CRE/pv_db.cpp @@ -2257,14 +2257,15 @@ ROB_PARTS_KIND pv_performer_item_to_rob_parts_kind(pv_performer_item item) { return RPK_NONE; } -item_sub_id pv_performer_item_to_item_sub_id(pv_performer_item item) { - static const item_sub_id pv_performer_item_id_to_item_sub_id_table[] = { - ITEM_SUB_ZUJO, ITEM_SUB_MEGANE, ITEM_SUB_KUBI, ITEM_SUB_JOHA_USHIRO, +ROB_ITEM_EQUIP_SUB_ID pv_performer_item_to_item_sub_id(pv_performer_item item) { + static const ROB_ITEM_EQUIP_SUB_ID pv_performer_item_id_to_item_sub_id_table[] = { + ROB_ITEM_EQUIP_SUB_ID_ZUJO, ROB_ITEM_EQUIP_SUB_ID_MEGANE, + ROB_ITEM_EQUIP_SUB_ID_KUBI, ROB_ITEM_EQUIP_SUB_ID_JOHA_USHIRO, }; if (item >= 0 && item < PV_PERFORMER_ITEM_MAX) return pv_performer_item_id_to_item_sub_id_table[item]; - return ITEM_SUB_NONE; + return ROB_ITEM_EQUIP_SUB_ID_NONE; } void task_pv_db_init() { diff --git a/src/CRE/pv_db.hpp b/src/CRE/pv_db.hpp index 2757568a..525033ad 100644 --- a/src/CRE/pv_db.hpp +++ b/src/CRE/pv_db.hpp @@ -556,7 +556,7 @@ namespace pv_db { } extern ROB_PARTS_KIND pv_performer_item_to_rob_parts_kind(pv_performer_item item); -extern item_sub_id pv_performer_item_to_item_sub_id(pv_performer_item item); +extern ROB_ITEM_EQUIP_SUB_ID pv_performer_item_to_item_sub_id(pv_performer_item item); extern void task_pv_db_init(); extern void task_pv_db_add_paths(); diff --git a/src/CRE/pv_expression.cpp b/src/CRE/pv_expression.cpp index 5d53203b..86b5552c 100644 --- a/src/CRE/pv_expression.cpp +++ b/src/CRE/pv_expression.cpp @@ -275,7 +275,7 @@ pv_expression::~pv_expression() { } bool pv_expression::ctrl() { - if (!rob_chr || rob_chr->data.motion.motion_id != motion_id) + if (!rob_chr || rob_chr->rob_base.robmot.num != motion_id) return false; float_t frame = rob_chr->get_frame(); @@ -435,9 +435,10 @@ void pv_expression::face_set_data(float_t frame) { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); - rob_chr->set_face_mottbl_motion(0, mottbl_index, value, - mottbl_index >= 214 && mottbl_index <= 223 ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, + MOTTABLE_TYPE mottbl_type = expression_id_to_mottbl_type(expression_id); + rob_chr->set_face_mottbl_motion(0, mottbl_type, value, + mottbl_type >= MTP_FACE_MOT_SLOT_1 && mottbl_type <= MTP_FACE_MOT_SLOT_10 + ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, offset, false, aft_mot_db); } diff --git a/src/CRE/pv_param.cpp b/src/CRE/pv_param.cpp index 6cacecc0..e5b2efa5 100644 --- a/src/CRE/pv_param.cpp +++ b/src/CRE/pv_param.cpp @@ -90,7 +90,7 @@ namespace pv_param { fuzzing_range = 2.0f; ratio = 0.0f; quality = 1.0f; - chara_id = -1; + rob_id = -1; } chara_alpha::chara_alpha() { @@ -648,7 +648,7 @@ namespace pv_param { if (i.flags & DOF_QUALITY) d.quality = i.quality; if (i.flags & DOF_AUTO_FOCUS) - d.chara_id = i.chara_id; + d.rob_id = i.rob_id; dof.push_back(d); } } @@ -836,9 +836,9 @@ namespace pv_param_task { } void post_process_task_set_chara_alpha( - int32_t chara_id, int32_t type, float_t alpha, float_t duration) { + ROB_ID rob_id, int32_t type, float_t alpha, float_t duration) { PostProcessCtrlCharaAlpha& chara_alpha = post_process_task.chara_alpha; - pv_param::chara_alpha& chara_alpha_data = chara_alpha.data.data[chara_id]; + pv_param::chara_alpha& chara_alpha_data = chara_alpha.data.data[rob_id]; chara_alpha_data.type = type; chara_alpha_data.frame = 0.0f; chara_alpha_data.alpha = alpha; @@ -846,17 +846,17 @@ namespace pv_param_task { } void post_process_task_set_chara_item_alpha( - int32_t chara_id, int32_t type, float_t alpha, float_t duration, + ROB_ID rob_id, int32_t type, float_t alpha, float_t duration, post_process_task_set_chara_item_alpha_callback callback, void* callback_data) { PostProcessCtrlCharaItemAlpha& chara_item_alpha = post_process_task.chara_item_alpha; - pv_param::chara_alpha& chara_item_alpha_data = chara_item_alpha.data.data[chara_id]; + pv_param::chara_alpha& chara_item_alpha_data = chara_item_alpha.data.data[rob_id]; chara_item_alpha_data.type = type; chara_item_alpha_data.frame = 0.0f; chara_item_alpha_data.alpha = alpha; chara_item_alpha_data.duration = duration; - chara_item_alpha.callback[chara_id] = callback; - chara_item_alpha.callback_data[chara_id] = callback_data; + chara_item_alpha.callback[rob_id] = callback; + chara_item_alpha.callback_data[rob_id] = callback_data; } bool post_process_task_del_task() { @@ -1007,10 +1007,10 @@ namespace pv_param_task { } void PostProcessCtrlCharaAlpha::Set() { - int32_t index = 0; + int32_t rob_id = 0; for (pv_param::chara_alpha& i : data.data) { if (i.frame < 0.0f) { - index++; + rob_id++; continue; } @@ -1036,14 +1036,14 @@ namespace pv_param_task { break; } - rob_chara_array_set_alpha_obj_flags(index, value, obj_flags); + rob_chara_array_set_alpha_obj_flags((ROB_ID)rob_id, value, obj_flags); i.frame += get_delta_frame(); if (i.frame > i.duration) { i.frame = -1.0f; i.prev_alpha = i.alpha; } - index++; + rob_id++; } } @@ -1067,10 +1067,10 @@ namespace pv_param_task { } void PostProcessCtrlCharaItemAlpha::Set() { - int32_t index = 0; + int32_t rob_id = 0; for (pv_param::chara_alpha& i : data.data) { if (i.frame < 0.0f) { - index++; + rob_id++; continue; } @@ -1083,14 +1083,14 @@ namespace pv_param_task { value = lerp_def(i.prev_alpha, i.alpha, i.frame / i.duration); if (callback) - callback[index](callback_data[index], index, i.type, value); + callback[rob_id](callback_data[rob_id], (ROB_ID)rob_id, i.type, value); i.frame += get_delta_frame(); if (i.frame > i.duration) { i.frame = -1.0f; i.prev_alpha = i.alpha; } - index++; + rob_id++; } } @@ -1145,16 +1145,16 @@ namespace pv_param_task { } void PostProcessCtrlDof::Set() { - bool autofocus = data.data.chara_id != -1; + bool autofocus = data.data.rob_id != ROB_ID_NULL; if (autofocus) { if (!rctx_ptr->render.get_dof_update()) return; vec3 trans = 0.0f; if (callback) - trans = callback(callback_data, data.data.chara_id); + trans = callback(callback_data, (ROB_ID)data.data.rob_id); else { - rob_chara* rob_chr = rob_chara_array_get(data.data.chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)data.data.rob_id); if (rob_chr) mat4_get_translation(rob_chr->get_bone_data_mat(BLK_CL_KAO), &trans); } diff --git a/src/CRE/pv_param.hpp b/src/CRE/pv_param.hpp index a4f7f74b..d94673b7 100644 --- a/src/CRE/pv_param.hpp +++ b/src/CRE/pv_param.hpp @@ -32,7 +32,7 @@ namespace pv_param { float_t fuzzing_range; float_t ratio; float_t quality; - int32_t chara_id; + int32_t rob_id; dof(); }; @@ -74,9 +74,9 @@ namespace pv_param { namespace pv_param_task { typedef void (*post_process_task_set_chara_item_alpha_callback) - (void* data, int32_t chara_id, int32_t type, float_t alpha); + (void* data, ROB_ID rob_id, int32_t type, float_t alpha); typedef vec3(*post_process_task_set_dof_callback) - (void* data, int32_t chara_id); + (void* data, ROB_ID rob_id); extern bool post_process_task_add_task(); extern void post_process_task_set_bloom_data( @@ -89,9 +89,9 @@ namespace pv_param_task { pv_param::dof& data, float_t duration, post_process_task_set_dof_callback callback, void* callback_data); extern void post_process_task_set_chara_alpha( - int32_t chara_id, int32_t type, float_t alpha, float_t duration); + ROB_ID rob_id, int32_t type, float_t alpha, float_t duration); extern void post_process_task_set_chara_item_alpha( - int32_t chara_id, int32_t type, float_t alpha, float_t duration, + ROB_ID rob_id, int32_t type, float_t alpha, float_t duration, post_process_task_set_chara_item_alpha_callback callback, void* callback_data); extern bool post_process_task_del_task(); } diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index ad16b612..abfee3ef 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -324,11 +324,11 @@ namespace rndr { this->exposure_query_index = query_index; int32_t next_query_index = (query_index + 2) % 3; for (int32_t i = 0; i < ROB_ID_MAX; i++, chara_data++) { - rob_chara* rob_chr = rob_chara_array_get(i); - if (!rob_chr || !rob_chr->is_visible()) + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); + if (!rob_chr || !rob_chr->get_disp_flag()) continue; - float_t max_face_depth = rob_chr->get_max_face_depth(); + float_t max_face_depth = rob_chr->get_face_depth(); mat4 mat = mat4_identity; rob_chr->sub_1405163C0(4, mat); @@ -1889,8 +1889,8 @@ namespace rndr { if (!reset_exposure) { ExposureCharaData* chara_data = exposure_chara_data; for (int32_t i = 0; i < ROB_ID_MAX; i++, chara_data++) { - rob_chara* rob_chr = rob_chara_array_get(i); - if (!rob_chr || !rob_chr->is_visible()) + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); + if (!rob_chr || !rob_chr->get_disp_flag()) continue; vec4 v34 = { 0.05f, 0.0f, -0.04f, 1.0f }; diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 4ccd921d..9be63fb4 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -563,8 +563,6 @@ struct render_context { bool chara_reflect; bool chara_refract; - mat4 matrix_buffer[MATRIX_BUFFER_COUNT]; - GLuint box_vao; GL::ArrayBuffer box_vbo; diff --git a/src/CRE/renderer/dof.cpp b/src/CRE/renderer/dof.cpp index 1847927f..d2dd9672 100644 --- a/src/CRE/renderer/dof.cpp +++ b/src/CRE/renderer/dof.cpp @@ -75,10 +75,11 @@ namespace renderer { if (dof_debug_data.flags & DOF_DEBUG_ENABLE_PHYS_DOF) { float_t focus = dof_debug_data.focus; if (dof_debug_data.flags & DOF_DEBUG_AUTO_FOCUS) { - rob_chara* rob_chr = 0; - for (int32_t i = 0; i < ROB_ID_MAX; i++) { - rob_chara* rob_chr = rob_chara_array_get(i); - if (!rob_chr || !rob_chr->is_visible()) + RobManagement* rob_man = get_rob_management(); + size_t rob_num = rob_man->get_rob_num(); + for (int32_t i = 0; i < rob_num; i++) { + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)i); + if (!rob_chr || !rob_chr->get_disp_flag()) continue; mat4 mat = mat4_identity; diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index dd70f018..afe39b01 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -78,6 +78,7 @@ static void closest_pt_segment_segment(vec3& vec, const vec3& p0, const vec3& q0 static void length_limit(vec3& p, const vec3& r, const float_t rr); static bool make_axis_matrix(mat4& mat, const vec3& axis, const skin_param_hinge* hinge, vec3* rot, const ROTTYPE& rottype); +static void make_direction_matrix(mat4& mat, const vec3& v0, const vec3& v1); static void modify_cloth_object(obj_mesh* mesh, obj_mesh_vertex_buffer* vb, CLOTH_VERTEX* vtxarg, float_t sgn, int32_t num_idx, uint16_t* idxtbl, bool do_ura); @@ -185,7 +186,7 @@ void ExNodeBlock::init_members() { // 0x1405EEB80 void ExNodeBlock::set_data(RobNode* node, ExNodeType type, - const char* name, const rob_chara_item_equip_object* skin_disp) { + const char* name, const RobSkinDisp* skin_disp) { init_members(); dst_node = node; @@ -195,6 +196,11 @@ void ExNodeBlock::set_data(RobNode* node, ExNodeType type, this->skin_disp = skin_disp; } +// 0x1405F92B0 +void ExNodeBlock::set_name(const char* name) { + this->name = name; +} + ExNullBlock::ExNullBlock() { init(); } @@ -251,7 +257,7 @@ void ExNullBlock::pos_init_cont() { } -void ExNullBlock::set_data(const rob_chara_item_equip_object* skin_disp, +void ExNullBlock::set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_constraint* data, const char* name, const bone_database* bone_data) { RobNode* node = (RobNode*)skin_disp->get_node(name, bone_data); type = EX_NODE_TYPE_NULL; @@ -1231,10 +1237,10 @@ void RobCloth::dest() { reset_data_list = 0; } -void RobCloth::AddMotionResetData(uint32_t motion_id, float_t frame) { +void RobCloth::AddMotionResetData(uint32_t motnum, float_t frame) { int32_t frame_int = (int32_t)prj::roundf(frame * 1000.0f); - auto elem = motion_reset_data.find({ motion_id, frame_int }); + auto elem = motion_reset_data.find({ motnum, frame_int }); if (elem != motion_reset_data.end()) motion_reset_data.erase(elem); @@ -1244,7 +1250,7 @@ void RobCloth::AddMotionResetData(uint32_t motion_id, float_t frame) { for (CLOTH_VERTEX* i = i_begin; i != i_end; i++) reset_data_list.push_back(i->reset_data); - motion_reset_data.insert({ { motion_id, frame_int }, reset_data_list }); + motion_reset_data.insert({ { motnum, frame_int }, reset_data_list }); } // 0x1402196D0 @@ -1282,20 +1288,20 @@ void RobCloth::CtrlOsagePlayData(const std::vector& opd_blend_da float_t frame = i->frame; #if OPD_PLAY_GEN - if (frame >= i->frame_count) - frame = i->no_loop ? i->frame_count - 1.0f : 0.0f; + if (frame >= i->frame_max) + frame = i->no_loop ? i->frame_max - 1.0f : 0.0f; #else - if (frame >= i->frame_count) + if (frame >= i->frame_max) frame = 0.0f; #endif int32_t curr_key = (int32_t)(int64_t)prj::floorf(frame); int32_t next_key = curr_key + 1; #if OPD_PLAY_GEN - if ((float_t)next_key >= i->frame_count) - next_key = i->no_loop ? (int32_t)i->frame_count - 1 : 0; + if ((float_t)next_key >= i->frame_max) + next_key = i->no_loop ? (int32_t)i->frame_max - 1 : 0; #else - if ((float_t)next_key >= i->frame_count) + if ((float_t)next_key >= i->frame_max) next_key = 0; #endif @@ -1402,9 +1408,9 @@ void RobCloth::LoadSkinParam(void* kv, const char* name, const bone_database* bo SetSkinParamOsageRoot(root); } -void RobCloth::SetMotionResetData(uint32_t motion_id, float_t frame) { +void RobCloth::SetMotionResetData(uint32_t motnum, float_t frame) { osage_reset = true; - auto elem = motion_reset_data.find({ motion_id, (int32_t)prj::roundf(frame * 1000.0f) }); + auto elem = motion_reset_data.find({ motnum, (int32_t)prj::roundf(frame * 1000.0f) }); if (elem != motion_reset_data.end() && elem->second.size() + width == vtxarg.size()) { this->reset_data_list = &elem->second; @@ -1798,7 +1804,7 @@ void RobCloth::modify_obj() { // 0x14021E460 void RobCloth::set_data(size_t w, size_t h, const obj_skin_ex_node_cloth_root * rt_data, const obj_skin_ex_node_cloth_point* move, const mat4* lcl_mat, uint32_t ring_flag, - const rob_chara_item_equip_object* skin, const bone_database* bone_data) { + const RobSkinDisp* skin, const bone_database* bone_data) { skin_disp = skin; obj* obj = objset_info_storage_get_obj(skin_disp->obj_uid); @@ -1937,7 +1943,7 @@ void RobCloth::set_data(size_t w, size_t h, const obj_skin_ex_node_cloth_root * // 0x14021EEB0 void RobCloth::set_data(const obj_skin_ex_node_cloth* cldata, - const rob_chara_item_equip_object* skin, const bone_database* bone_data) { + const RobSkinDisp* skin, const bone_database* bone_data) { dest(); data = cldata; set_data(cldata->width, cldata->height, cldata->fix_point, @@ -2072,7 +2078,7 @@ void ExClothBlock::CtrlStep(int32_t stage, bool disable_ex_force) { void ExClothBlock::ctrl() { set_param(); - const rob_chara_item_equip* rob_disp = skin_disp->rob_disp; + const RobDisp* rob_disp = skin_disp->rob_disp; float_t delta_frame = get_delta_frame(); #if OPD_PLAY_GEN if (opd_play_gen_run) @@ -2112,16 +2118,16 @@ void ExClothBlock::pos_init_cont() { cloth_work.pos_init_cont(); } -void ExClothBlock::AddMotionResetData(uint32_t motion_id, float_t frame) { - cloth_work.AddMotionResetData(motion_id, frame); +void ExClothBlock::AddMotionResetData(const uint32_t& motnum, const float_t& frame) { + cloth_work.AddMotionResetData(motnum, frame); } const float_t* ExClothBlock::LoadOpdData(size_t node_index, const float_t* opd_data, size_t opd_count) { return cloth_work.LoadOpdData(node_index, opd_data, opd_count); } -void ExClothBlock::SetMotionResetData(uint32_t motion_id, float_t frame) { - cloth_work.SetMotionResetData(motion_id, frame); +void ExClothBlock::SetMotionResetData(const uint32_t& motnum, const float_t& frame) { + cloth_work.SetMotionResetData(motnum, frame); } const float_t* ExClothBlock::SetOsagePlayDataInit(const float_t* opdi_data) { @@ -2155,7 +2161,7 @@ void ExClothBlock::reset_ex_force() { cloth_work.reset_ex_force(); } -void ExClothBlock::set_data(const rob_chara_item_equip_object* skin_disp, +void ExClothBlock::set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_cloth* data, const skin_param_osage_root* skp_root, const bone_database* bone_data) { type = EX_NODE_TYPE_CLOTH; dst_node = 0; @@ -2194,10 +2200,10 @@ RobOsage::~RobOsage() { } -void RobOsage::AddMotionResetData(uint32_t motion_id, float_t frame) { +void RobOsage::AddMotionResetData(const uint32_t& motnum, const float_t& frame) { int32_t frame_int = (int32_t)prj::roundf(frame * 1000.0f); - auto elem = motion_reset_data.find({ motion_id, frame_int }); + auto elem = motion_reset_data.find({ motnum, frame_int }); if (elem != motion_reset_data.end()) motion_reset_data.erase(elem); @@ -2207,7 +2213,7 @@ void RobOsage::AddMotionResetData(uint32_t motion_id, float_t frame) { for (RobJointNode* i = i_begin; i != i_end; i++) reset_data_list.push_back(i->reset_data); - motion_reset_data.insert({ { motion_id, frame_int }, reset_data_list }); + motion_reset_data.insert({ { motnum, frame_int }, reset_data_list }); } // 0x14047D620 @@ -2638,20 +2644,20 @@ void RobOsage::CtrlOsagePlayData(const mat4& root_matrix, float_t frame = i->frame; #if OPD_PLAY_GEN - if (frame >= i->frame_count) - frame = i->no_loop ? i->frame_count - 1.0f : 0.0f; + if (frame >= i->frame_max) + frame = i->no_loop ? i->frame_max - 1.0f : 0.0f; #else - if (frame >= i->frame_count) + if (frame >= i->frame_max) frame = 0.0f; #endif int32_t curr_key = (int32_t)(int64_t)prj::floorf(frame); int32_t next_key = curr_key + 1; #if OPD_PLAY_GEN - if ((float_t)next_key >= i->frame_count) - next_key = i->no_loop ? (int32_t)i->frame_count - 1 : 0; + if ((float_t)next_key >= i->frame_max) + next_key = i->no_loop ? (int32_t)i->frame_max - 1 : 0; #else - if ((float_t)next_key >= i->frame_count) + if ((float_t)next_key >= i->frame_max) next_key = 0; #endif @@ -2810,9 +2816,9 @@ void RobOsage::SetDisableCollision(const bool& value) { disable_collision = value; } -void RobOsage::SetMotionResetData(uint32_t motion_id, float_t frame) { +void RobOsage::SetMotionResetData(const uint32_t& motnum, const float_t& frame) { osage_reset = true; - auto elem = motion_reset_data.find({ motion_id, (int32_t)prj::roundf(frame * 1000.0f) }); + auto elem = motion_reset_data.find({ motnum, (int32_t)prj::roundf(frame * 1000.0f) }); if (elem != motion_reset_data.end() && elem->second.size() + 1 == joint_node_vec.size()) reset_data_list = &elem->second; } @@ -3236,7 +3242,7 @@ void ExOsageBlock::CtrlBegin() { } void ExOsageBlock::CtrlStep(int32_t stage, bool disable_ex_force) { - const rob_chara_item_equip* rob_disp = skin_disp->rob_disp; + const RobDisp* rob_disp = skin_disp->rob_disp; float_t delta_frame = get_delta_frame(); #if OPD_PLAY_GEN if (opd_play_gen_run) @@ -3282,7 +3288,7 @@ void ExOsageBlock::ctrl() { return; } - const rob_chara_item_equip* rob_disp = skin_disp->rob_disp; + const RobDisp* rob_disp = skin_disp->rob_disp; float_t delta_frame = get_delta_frame(); #if OPD_PLAY_GEN if (opd_play_gen_run) @@ -3358,8 +3364,8 @@ void ExOsageBlock::CtrlEnd() { done = false; } -void ExOsageBlock::AddMotionResetData(uint32_t motion_id, float_t frame) { - osage_work.AddMotionResetData(motion_id, frame); +void ExOsageBlock::AddMotionResetData(const uint32_t& motnum, const float_t& frame) { + osage_work.AddMotionResetData(motnum, frame); } const float_t* ExOsageBlock::LoadOpdData(size_t node_index, const float_t* opd_data, size_t opd_count) { @@ -3371,8 +3377,8 @@ void ExOsageBlock::SetDisableCollision(const bool& value) { osage_work.SetDisableCollision(value); } -void ExOsageBlock::SetMotionResetData(uint32_t motion_id, float_t frame) { - osage_work.SetMotionResetData(motion_id, frame); +void ExOsageBlock::SetMotionResetData(const uint32_t& motnum, const float_t& frame) { + osage_work.SetMotionResetData(motnum, frame); } const float_t* ExOsageBlock::SetOsagePlayDataInit(const float_t* opdi_data) { @@ -3398,37 +3404,36 @@ void ExOsageBlock::SetWindDirection() { } // 0x1405F3E10 -void ExOsageBlock::get_node_list( - const obj_skin_ex_node_osage* osg_data, const obj_skin_osage_joint* joint, - prj::vector_pair& joint_node_list, - std::map& ex_node_list) { +void ExOsageBlock::make_joint_map(const obj_skin_ex_node_osage* root, + const obj_skin_osage_joint* joint, prj::vector_pair& joint_map, + std::map& node_name_map) { RobJointNode* root_node = osage_work.get_joint_node(0); - joint_node_list.push_back(osg_data->root_idx, root_node); + joint_map.push_back(root->root_idx, root_node); - for (uint32_t i = 0; i < osg_data->nb_joint; i++) { + for (uint32_t i = 0; i < root->nb_joint; i++) { RobJointNode* node = osage_work.get_joint_node(i + 1ULL); - joint_node_list.push_back(joint[i].nid, node); + joint_map.push_back(joint[i].nid, node); if (node->dst_node && node->dst_node->name) - ex_node_list.insert({ node->dst_node->name, this }); + node_name_map.insert({ node->dst_node->name, this }); } - RobJointNode* effector_node = osage_work.get_joint_node(osg_data->nb_joint + 1ULL); - joint_node_list.push_back(osg_data->efc_idx, effector_node); + RobJointNode* effector_node = osage_work.get_joint_node(root->nb_joint + 1ULL); + joint_map.push_back(root->efc_idx, effector_node); if (effector_node->dst_node && effector_node->dst_node->name) - ex_node_list.insert({ effector_node->dst_node->name, this }); + node_name_map.insert({ effector_node->dst_node->name, this }); } void ExOsageBlock::reset_ex_force() { osage_work.reset_ex_force(); } -// 0x140 -void ExOsageBlock::set_data(const rob_chara_item_equip_object* skp, - const obj_skin_ex_node_osage* root, const char* name, const obj_skin_osage_joint* joint, +// 0x1405F7E10 +void ExOsageBlock::set_data(const RobSkinDisp* skp, + const obj_skin_ex_node_osage* root, const obj_skin_osage_joint* joint, const RobNode* mot_node, RobNode* ex_node, const obj_skin* skin) { - ExNodeBlock::set_data(&ex_node[root->root_idx & 0x7FFF], EX_NODE_TYPE_OSAGE, name, skp); + ExNodeBlock::set_data(&ex_node[root->root_idx & 0x7FFF], EX_NODE_TYPE_OSAGE, 0, skp); osage_work.init(root, joint, ex_node, skin); flag.pos_init = 0; motion_matrix = mot_node->mat_ptr; @@ -3569,7 +3574,7 @@ inline void ExConstraintBlock::CalcConstraintDirection(mat4 mat) { return; mat4 rot_mat; - RobBlock::orient_to_target(rot_mat, align_axis, v51); + make_direction_matrix(rot_mat, align_axis, v51); if (upvector_node) { vec3 affected_axis = direction->up_vector.affected_axis; @@ -3645,7 +3650,7 @@ void ExConstraintBlock::CalcConstraintPosition(mat4 mat) { mat4_inverse_transform_point(&mat, &up_vector_trans, &up_vector_trans); mat4 rot_mat; - RobBlock::orient_to_target(rot_mat, position->up_vector.affected_axis, up_vector_trans); + make_direction_matrix(rot_mat, position->up_vector.affected_axis, up_vector_trans); mat4_mul(&rot_mat, &mat, &mat); } @@ -3681,7 +3686,7 @@ void ExConstraintBlock::CalcMatrixHS() { } -void ExConstraintBlock::set_data(const rob_chara_item_equip_object* skin_disp, +void ExConstraintBlock::set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_constraint* data, const char* name, const bone_database* bone_data) { RobNode* node = (RobNode*)skin_disp->get_node(name, bone_data); type = EX_NODE_TYPE_CONSTRAINT; @@ -3864,7 +3869,7 @@ void ExExpressionBlock::CalcMatrixHS() { *dst_node->no_scale_mat = mat; } -void ExExpressionBlock::set_data(const rob_chara_item_equip_object* skin_disp, +void ExExpressionBlock::set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_expression* data, const char* node_name, object_info objuid, size_t index, const bone_database* bone_data) { Expr_node* stack_buf[28]; @@ -4312,6 +4317,18 @@ static bool make_axis_matrix(mat4& mat, const vec3& axis, return rot_clamped; } +// 0x1401EB410 +static void make_direction_matrix(mat4& mat, const vec3& v0, const vec3& v1) { + vec3 v0_norm = vec3::normalize(v0); + vec3 v1_norm = vec3::normalize(v1); + + vec3 axis = vec3::cross(v1_norm, v0_norm); + + float_t c = clamp_def(vec3::dot(v1_norm, v0_norm), -1.0f, 1.0f); + float_t s = sqrtf(clamp_def(1.0f - c * c, 0.0f, 1.0f)); + mat4_set(&axis, -s, c, &mat); +} + static void modify_cloth_object(obj_mesh* mesh, obj_mesh_vertex_buffer* vb, CLOTH_VERTEX* vtxarg, float_t sgn, int32_t num_idx, uint16_t* idxtbl, bool do_ura) { if (!mesh || !vb || (mesh->vertex_format diff --git a/src/CRE/rob/motion.cpp b/src/CRE/rob/motion.cpp index d8ce5e96..c6c0fa38 100644 --- a/src/CRE/rob/motion.cpp +++ b/src/CRE/rob/motion.cpp @@ -7,10 +7,10 @@ #include "../../KKdLib/io/path.hpp" #include "../data.hpp" -static const mothead_mot mothead_mot_null; +static const MhdData mothead_mot_null; std::map mothead_storage_data; -std::map motion_storage_data; +std::map sp_mot_data; MhdFile::MhdFile() : data(), set(), load_count() { FreeData(); @@ -49,88 +49,73 @@ void MhdFile::LoadFile(const char* path, const char* file, uint32_t set) { void MhdFile::ParseFile(const void* data) { alloc_handler = prj::shared_ptr(new prj::stack_allocator); - mothead_file* mhdf = (mothead_file*)((size_t)data + ((uint32_t*)data)[1]); + MhdFileHeaderFile* mhdf = (MhdFileHeaderFile*)((size_t)data + ((uint32_t*)data)[1]); this->data = MhdFile::ParseMothead(mhdf, (size_t)mhdf); } -mothead* MhdFile::ParseMothead(mothead_file* mhdf, size_t data) { - mothead* mhd = alloc_handler->allocate(); - mhd->mot_set_id = mhdf->mot_set_id; - mhd->first_mot_id = mhdf->first_mot_id; - mhd->last_mot_id = mhdf->last_mot_id; - uint32_t* mot_offsets = (uint32_t*)(data + mhdf->mot_offsets_offset); - size_t mot_count = (size_t)mhdf->last_mot_id - mhdf->first_mot_id + 1; - mhd->mots = alloc_handler->allocate(mot_count); - mothead_mot** mots = mhd->mots; - for (; mot_count; mot_count--) { - *mots = 0; - if (*mot_offsets) - *mots = ParseMotheadMot((mothead_mot_file*)(data + *mot_offsets), data); - mots++; - mot_offsets++; +MhdFileHeader* MhdFile::ParseMothead(MhdFileHeaderFile* mhdf, size_t data) { + MhdFileHeader* mhd = alloc_handler->allocate(); + mhd->file_id = mhdf->file_id; + mhd->min_mot_id = mhdf->min_mot_id; + mhd->max_mot_id = mhdf->max_mot_id; + + uint32_t* data_list_offsets = (uint32_t*)(data + mhdf->data_list_offsets_offset); + size_t mot_count = (size_t)mhdf->max_mot_id - mhdf->min_mot_id + 1; + mhd->data_list = alloc_handler->allocate(mot_count); + MhdData** data_list = mhd->data_list; + for (; mot_count; mot_count--, data_list_offsets++, data_list++) { + *data_list = 0; + if (*data_list_offsets) + *data_list = ParseMotheadMot((MhdDataFile*)(data + *data_list_offsets), data); } return mhd; } -mothead_mot* MhdFile::ParseMotheadMot(mothead_mot_file* mhdsf, size_t data) { - struct mothead_mot_data_file { - int32_t type; - uint32_t offset; - }; +MhdData* MhdFile::ParseMotheadMot(MhdDataFile* mhdf, size_t data) { + MhdData* mhdm = alloc_handler->allocate(); + mhdm->mot_kind = mhdf->mot_kind; + mhdm->start_style = mhdf->start_style; + mhdm->end_style = mhdf->end_style; - struct mothead_data_file { - mothead_data_type type; - int32_t frame; - uint32_t offset; - }; + if (mhdf->mh_list_offset) { + MhdListFile* mh_list_file = (MhdListFile*)(data + mhdf->mh_list_offset); + MhdListFile* mh_list_file_end = mh_list_file; + while ((mh_list_file_end++)->type >= 0); - mothead_mot* mhdm = alloc_handler->allocate(); - mhdm->field_0.field_0 = mhdsf->field_0; - mhdm->field_0.field_4 = mhdsf->field_4; - mhdm->field_0.field_8 = mhdsf->field_8; - mhdm->field_0.field_C = mhdsf->field_C; - mhdm->field_10 = mhdsf->field_10; - mhdm->field_12 = mhdsf->field_12; - - if (mhdsf->mot_data_offset) { - mothead_mot_data_file* mot_data_file = (mothead_mot_data_file*)(data + mhdsf->mot_data_offset); - mothead_mot_data_file* mot_data_file_end = mot_data_file; - while ((mot_data_file_end++)->type >= 0); - - size_t count = mot_data_file_end - mot_data_file; - mhdm->mot_data = alloc_handler->allocate(count); - mothead_mot_data* mot_data = mhdm->mot_data; - for (size_t i = count; i; i--, mot_data_file++, mot_data++) { - mot_data->type = mot_data_file->type; - mot_data->data = (void*)(data + mot_data_file->offset); + size_t count = mh_list_file_end - mh_list_file; + mhdm->mh_list = alloc_handler->allocate(count); + MhdList* mh_list = mhdm->mh_list; + for (size_t i = count; i; i--, mh_list_file++, mh_list++) { + mh_list->type = mh_list_file->type; + mh_list->data = (void*)(data + mh_list_file->data_offset); } } - if (mhdsf->data_offset) { - mothead_data_file* data_file = (mothead_data_file*)(data + mhdsf->data_offset); - mothead_data_file* data_file_end = data_file; - while ((data_file_end++)->type >= 0); + if (mhdf->pp_list_offset) { + MhpListFile* pp_list_file = (MhpListFile*)(data + mhdf->pp_list_offset); + MhpListFile* pp_list_file_end = pp_list_file; + while ((pp_list_file_end++)->type >= 0); - size_t count = data_file_end - data_file; - mhdm->data = alloc_handler->allocate(count); - mothead_data* _data = mhdm->data; - for (size_t i = count; i; i--, data_file++, _data++) { - _data->type = data_file->type; - _data->frame = data_file->frame; - _data->data = (void*)(data + data_file->offset); + size_t count = pp_list_file_end - pp_list_file; + mhdm->pp_list = alloc_handler->allocate(count); + MhpList* pp_list = mhdm->pp_list; + for (size_t i = count; i; i--, pp_list_file++, pp_list++) { + pp_list->type = pp_list_file->type; + pp_list->frame = pp_list_file->frame; + pp_list->data = (void*)(data + pp_list_file->data_offset); } } - if (mhdsf->field_1C) { - uint32_t* v29 = (uint32_t*)(data + mhdsf->field_1C); - uint32_t* v30 = v29; - while (*v30++); + if (mhdf->cm_list_offset) { + MhcListFile* cm_list_file = (MhcListFile*)(data + mhdf->cm_list_offset); + MhcListFile* cm_list_file_end = cm_list_file; + while ((cm_list_file_end++)->data_offset); - size_t count = v30 - v29; - mhdm->field_28 = alloc_handler->allocate(count); - int64_t* v33 = mhdm->field_28; - for (size_t i = count; i; i--) - *v33++ = data + *v29++; + size_t count = cm_list_file_end - cm_list_file; + mhdm->cm_list = alloc_handler->allocate(count); + MhcList* cm_list = mhdm->cm_list; + for (size_t i = count; i; i--, cm_list_file++, cm_list++) + cm_list->data = (void*)(data + cm_list_file->data_offset); } return mhdm; } @@ -243,6 +228,36 @@ void MotFile::ParseFileParent(MotFile* mot, const void* file_data, size_t size) mot->ParseFile(file_data, size); } +const mot_data* get_motiondata_address(uint32_t motnum, const motion_database* mot_db) { + if (motnum == -1) // It should be motnum < 0, but we're dealing with unsigned value, so there it is + return 0; + + const motion_set_info* set_info = mot_db->get_motion_set_by_motion_id(motnum); + if (!set_info) { + printf_debug_info("%08x : illegal motfile Num.\n", motnum); + return 0; + } + + for (const motion_info& i : set_info->motion) { + if (i.id != motnum) + continue; + + auto elem = sp_mot_data.find(set_info->id); + if (elem != sp_mot_data.end()) + return &elem->second.mot_set->mot_data[&i - set_info->motion.data()]; + return 0; + } + + return 0; +} + +float_t get_mot_frame_max(uint32_t mot_id, const motion_database* mot_db) { + const mot_data* mot = get_motiondata_address(mot_id, mot_db); + if (mot) + return mot->frame_max; + return 0.0f; +} + void motion_set_load_mothead(uint32_t set, std::string&& mdata_dir, const motion_database* mot_db) { const motion_set_info* set_info = mot_db->get_motion_set_by_id(set); if (!set_info) { @@ -277,9 +292,9 @@ void motion_set_load_motion(uint32_t set, std::string&& mdata_dir, const motion_ if (!set_info) return; - auto elem = motion_storage_data.find(set); - if (elem == motion_storage_data.end()) - elem = motion_storage_data.insert({ set, {} }).first; + auto elem = sp_mot_data.find(set); + if (elem == sp_mot_data.end()) + elem = sp_mot_data.insert({ set, {} }).first; elem->second.mot_set_info = set_info; elem->second.LoadFile(std::string(mdata_dir), set); @@ -292,9 +307,9 @@ void motion_set_unload_mothead(uint32_t set) { } void motion_set_unload_motion(uint32_t set) { - auto elem = motion_storage_data.find(set); - if (elem != motion_storage_data.end() && elem->second.Unload()) - motion_storage_data.erase(elem); + auto elem = sp_mot_data.find(set); + if (elem != sp_mot_data.end() && elem->second.Unload()) + sp_mot_data.erase(elem); } bool mothead_storage_check_mhd_file_not_ready(uint32_t set_id) { @@ -311,7 +326,7 @@ MhdFile* mothead_storage_get_mhd_file(uint32_t set_id) { return 0; } -const mothead_mot* mothead_storage_get_mot_by_motion_id( +const MhdData* mothead_storage_get_mot_by_motion_id( uint32_t motion_id, const motion_database* mot_db) { uint32_t set_id = mot_db->get_motion_set_id_by_motion_id(motion_id); if (set_id == -1) @@ -321,70 +336,43 @@ const mothead_mot* mothead_storage_get_mot_by_motion_id( if (elem == mothead_storage_data.end() || !elem->second.data) return &mothead_mot_null; - mothead* mhd = elem->second.data; - if ((int32_t)motion_id < mhd->first_mot_id || (int32_t)motion_id > mhd->last_mot_id) + MhdFileHeader* mhd = elem->second.data; + if (motion_id < mhd->min_mot_id || motion_id > mhd->max_mot_id) return &mothead_mot_null; - mothead_mot* mot = mhd->mots[(ssize_t)(int32_t)motion_id - mhd->first_mot_id]; + MhdData* mot = mhd->data_list[(ssize_t)motion_id - mhd->min_mot_id]; if (!mot) return &mothead_mot_null; return mot; } bool motion_storage_check_mot_file_not_ready(uint32_t set_id) { - auto elem = motion_storage_data.find(set_id); - if (elem != motion_storage_data.end()) + auto elem = sp_mot_data.find(set_id); + if (elem != sp_mot_data.end()) return elem->second.CheckNotReady(); return false; } MotFile* motion_storage_get_mot_file(uint32_t set_id) { - auto elem = motion_storage_data.find(set_id); - if (elem != motion_storage_data.end()) + auto elem = sp_mot_data.find(set_id); + if (elem != sp_mot_data.end()) return &elem->second; return 0; } -const mot_data* motion_storage_get_mot_data(uint32_t motion_id, const motion_database* mot_db) { - const motion_set_info* set_info = mot_db->get_motion_set_by_motion_id(motion_id); - if (!set_info) { - printf_debug_info("%08x : illegal motfile Num.\n", motion_id); - return 0; - } - - for (const motion_info& i : set_info->motion) { - if (i.id != motion_id) - continue; - - auto elem = motion_storage_data.find(set_info->id); - if (elem != motion_storage_data.end()) - return &elem->second.mot_set->mot_data[&i - set_info->motion.data()]; - return 0; - } - - return 0; -} - -float_t motion_storage_get_mot_data_frame_count(uint32_t motion_id, const motion_database* mot_db) { - const mot_data* mot = motion_storage_get_mot_data(motion_id, mot_db); - if (mot) - return mot->frame_count; - return 0.0f; -} - const mot_set* motion_storage_get_motion_set(uint32_t set_id) { - auto elem = motion_storage_data.find(set_id); - if (elem != motion_storage_data.end()) + auto elem = sp_mot_data.find(set_id); + if (elem != sp_mot_data.end()) return elem->second.mot_set; return 0; } void motion_init() { mothead_storage_data = {}; - motion_storage_data = {}; + sp_mot_data = {}; } void motion_free() { - motion_storage_data.clear(); + sp_mot_data.clear(); mothead_storage_data.clear(); } diff --git a/src/CRE/rob/motion.hpp b/src/CRE/rob/motion.hpp index 9b59d6b8..5548fa25 100644 --- a/src/CRE/rob/motion.hpp +++ b/src/CRE/rob/motion.hpp @@ -7,8 +7,46 @@ #include "rob.hpp" +struct MhdListFile { + int32_t type; + uint32_t data_offset; +}; + +struct MhpListFile { + int32_t type; + int32_t frame; + uint32_t data_offset; +}; + +struct MhcListFile { + uint32_t data_offset; +}; + +struct MhdDataFile { + MhdKind mot_kind; + uint16_t start_style; + uint16_t end_style; + uint32_t mh_list_offset; + uint32_t pp_list_offset; + uint32_t cm_list_offset; +}; + +struct MhdFileHeaderFile { + uint32_t file_id; + uint32_t min_mot_id; + uint32_t max_mot_id; + uint32_t data_list_offsets_offset; +}; + +/*struct MhdFileHeaderFileModern { + uint32_t file_id; + uint32_t num_mot; + int64_t ids_offset; + int64_t data_list_offsets_offset; +};*/ + struct MhdFile { - mothead* data; + MhdFileHeader* data; uint32_t set; std::string file_path; // Added p_file_handler file_handler; @@ -22,8 +60,8 @@ struct MhdFile { void FreeData(); void LoadFile(const char* path, const char* file, uint32_t set); void ParseFile(const void* data); - mothead* ParseMothead(mothead_file* mhdsf, size_t data); - mothead_mot* ParseMotheadMot(mothead_mot_file* mhdsf, size_t data); + MhdFileHeader* ParseMothead(MhdFileHeaderFile* mhdf, size_t data); + MhdData* ParseMotheadMot(MhdDataFile* mhdf, size_t data); bool Unload(); static void ParseFileParent(MhdFile* mhd, const void* file_data, size_t size); @@ -48,6 +86,9 @@ struct MotFile { static void ParseFileParent(MotFile* mot, const void* file_data, size_t size); }; +extern const mot_data* get_motiondata_address(uint32_t mot_id, const motion_database* mot_db); +extern float_t get_mot_frame_max(uint32_t mot_id, const motion_database* mot_db); + extern void motion_set_load_mothead(uint32_t set, std::string&& mdata_dir, const motion_database* mot_db); extern void motion_set_load_motion(uint32_t set, std::string&& mdata_dir, const motion_database* mot_db); extern void motion_set_unload_mothead(uint32_t set); @@ -55,12 +96,10 @@ extern void motion_set_unload_motion(uint32_t set); extern bool mothead_storage_check_mhd_file_not_ready(uint32_t set_id); extern MhdFile* mothead_storage_get_mhd_file(uint32_t set_id); -extern const mothead_mot* mothead_storage_get_mot_by_motion_id( +extern const MhdData* mothead_storage_get_mot_by_motion_id( uint32_t motion_id, const motion_database* mot_db); extern bool motion_storage_check_mot_file_not_ready(uint32_t set_id); extern MotFile* motion_storage_get_mot_file(uint32_t set_id); -extern const mot_data* motion_storage_get_mot_data(uint32_t motion_id, const motion_database* mot_db); -extern float_t motion_storage_get_mot_data_frame_count(uint32_t motion_id, const motion_database* mot_db); extern const mot_set* motion_storage_get_motion_set(uint32_t set_id); extern void motion_init(); diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index 25175b16..73e3c5b2 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -48,8 +48,8 @@ struct OpdMaker { ~Data(); bool CheckOpdiFilesNotReady(); - const void* GetOpdiFileData(object_info obj_info, uint32_t motion_id); - bool IsValidOpdiFile(rob_chara* rob_chr, uint32_t motion_id); + const void* GetOpdiFileData(object_info obj_info, uint32_t motnum); + bool IsValidOpdiFile(rob_chara* rob_chr, uint32_t motnum); void ReadOpdiFiles(rob_chara* rob_chr, std::vector& motions); void Reset(); }; @@ -74,7 +74,7 @@ struct OpdMaker { bool InitThread(rob_chara* rob_chr, const std::vector* motion_ids, OpdMaker::Data* data); bool IsWaiting(); void Reset(); - bool SetOsagePlayInitData(uint32_t motion_id); + bool SetOsagePlayInitData(uint32_t motnum); void SetEnd(); void SetWaiting(bool value); @@ -83,12 +83,12 @@ struct OpdMaker { struct OpdMakeWorker : public app::Task { int32_t state; - int32_t chara_id; + ROB_ID rob_id; int32_t items[25]; bool use_current_skp; OpdMaker::Data data; - OpdMakeWorker(int32_t chara_id); + OpdMakeWorker(ROB_ID rob_id); virtual ~OpdMakeWorker() override; virtual bool init() override; @@ -154,14 +154,14 @@ bool operator>=(const OpdPlayGen::Object& left, const OpdPlayGen::Object& right) struct osage_play_data_init_header { uint32_t signature; std::pair obj_info; - uint32_t motion_id; + uint32_t motnum; uint16_t nodes_count; }; struct osage_play_data_header { uint32_t signature; std::pair obj_info; - uint32_t motion_id; + uint32_t motnum; uint32_t frame_count; uint16_t nodes_count; @@ -195,11 +195,11 @@ struct opd_vec3_data_vec { }; struct opd_chara_data { - int32_t chara_id; + ROB_ID rob_id; bool init; - uint32_t frame_index; - uint32_t frame_count; - uint32_t motion_id; + uint32_t frame; + uint32_t frame_max; + uint32_t motnum; uint64_t field_18; std::vector> opd_data[RPK_ITEM_MAX]; p_farc_write opd[RPK_ITEM_MAX]; @@ -210,9 +210,9 @@ struct opd_chara_data { void add_frame_data(); void encode_data(); - void encode_init_data(uint32_t motion_id); + void encode_init_data(uint32_t motnum); void fs_copy_file(); - void init_data(uint32_t motion_id); + void init_data(uint32_t motnum); void open_opd_file(); void open_opdi_file(); void reset(); @@ -238,7 +238,7 @@ public: void AppendCharaMotionId(rob_chara* rob_chr, const std::vector& motion_ids); bool CheckTaskReady(); void GetOpdFileData(object_info obj_info, - uint32_t motion_id, const float_t*& data, uint32_t& count); + uint32_t motnum, const float_t*& data, uint32_t& count); void LoadOpdFile(p_file_handler* pfhndl); void LoadOpdFileList(); void Reset(); @@ -260,37 +260,37 @@ struct osage_play_data_database_struct { struct rob_osage_mothead_data { bool init; - mothead_data_type type; - const mothead_data* data; + int32_t type; + MhpList* pp_list; - rob_osage_mothead_data(mothead_data_type type, uint32_t motion_id, const motion_database* mot_db); + rob_osage_mothead_data(int32_t type, uint32_t motnum, const motion_database* mot_db); ~rob_osage_mothead_data(); - const mothead_data* find_next_data(); + MhpList* find_next_data(); }; struct rob_osage_mothead { rob_chara* rob_chr; - uint32_t motion_id; + uint32_t motnum; float_t frame; float_t last_frame; rob_osage_mothead_data* rob_parts_adjust; - const mothead_data* rob_parts_adjust_data; + MhpList* rob_parts_adjust_data; rob_osage_mothead_data* rob_adjust_global; - const mothead_data* rob_adjust_global_data; + MhpList* rob_adjust_global_data; rob_osage_mothead_data* sleeve_adjust; - const mothead_data* sleeve_adjust_data; + MhpList* sleeve_adjust_data; rob_osage_mothead_data* disable_collision; - const mothead_data* disable_collision_data; + MhpList* disable_collision_data; rob_osage_mothead_data* rob_chara_coli_ring; - const mothead_data* rob_chara_coli_ring_data; + MhpList* rob_chara_coli_ring_data; int32_t field_68; - rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, uint32_t motion_id, + rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, uint32_t motnum, float_t frame, const bone_database* bone_data, const motion_database* mot_db); #if OPD_PLAY_GEN rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, - uint32_t motion_id, float_t frame, bool set_motion_reset_data, + uint32_t motnum, float_t frame, bool set_motion_reset_data, const bone_database* bone_data, const motion_database* mot_db); #endif ~rob_osage_mothead(); @@ -299,18 +299,18 @@ struct rob_osage_mothead { void init_data(const motion_database* mot_db); void reset(); void reset_data(); - void set_coli_ring(const mothead_data* mhd_data); - void set_disable_collision(const mothead_data* mhd_data); + void set_coli_ring(MhpList* list); + void set_disable_collision(MhpList* list); void set_frame(float_t value); void set_mothead_frame(); - void set_rob_parts_adjust(const mothead_data* mhd_data); - void set_rob_adjust_global(const mothead_data* mhd_data); - void set_sleeve_adjust(const mothead_data* mhd_data); + void set_rob_parts_adjust(MhpList* list); + void set_rob_adjust_global(MhpList* list); + void set_sleeve_adjust(MhpList* list); }; struct OpdMakeManager : app::Task { struct CharaCostume { - std::vector items[ITEM_SUB_MAX]; + std::vector items[ROB_ITEM_EQUIP_SUB_ID_MAX]; CharaCostume(); ~CharaCostume(); @@ -327,7 +327,7 @@ struct OpdMakeManager : app::Task { void AddCostumes(const std::list>& costumes); void AddObjects(const std::vector& customize_items); bool CheckNoItems(CHARA_NUM chara_num); - void PopItems(CHARA_NUM chara_num, int32_t items[ITEM_SUB_MAX]); + void PopItems(CHARA_NUM chara_num, int32_t items[ROB_ITEM_EQUIP_SUB_ID_MAX]); void Reset(); void SortUnique(); }; @@ -355,30 +355,6 @@ struct OpdMakeManager : app::Task { OpdMakeManagerData* GetData(); }; -struct mothead_mot_func_data { - rob_chara* rob_chara; - rob_chara_data* rob_base; - struc_223* field_10; -}; - -struct mothead_func_data { - rob_chara* rob_chr; - rob_chara_data* rob_base; - rob_chara_data* field_10; - rob_chara* field_18; - rob_chara_data* field_20; - struc_223* field_28; -}; - -typedef void(*mothead_func)(mothead_func_data*, const void*, - const mothead_data*, int32_t, const motion_database*); -typedef void(*mothead_mot_func)(mothead_mot_func_data*, const void*, const mothead_mot_data*); - -struct mothead_func_struct { - mothead_func func; - int32_t flags; -}; - class ReqData { public: CHARA_NUM chara_num; @@ -393,15 +369,286 @@ public: class ReqDataObj : public ReqData { public: - item_cos_data cos; + RobItemEquip item_set; ReqDataObj(); - ReqDataObj(CHARA_NUM chara_num, int32_t count); + ReqDataObj(CHARA_NUM cn, int32_t count); virtual ~ReqDataObj() override; virtual void Reset() override; }; +struct RobMhSmd; + +typedef void (RobMhSmd::* SmdFunc)(const void*, MhdList*); + +struct RobMhSmd { + rob_chara* impl; + RobBase* base; + RobMotData* motd; + + static const SmdFunc functbl[]; + + void exec_func(int32_t type, MhdList* list); + + void smd_next(const void* mhadr, MhdList* list); + void func_1(const void* mhadr, MhdList* list); + void func_2(const void* mhadr, MhdList* list); + void func_3(const void* mhadr, MhdList* list); + void func_4(const void* mhadr, MhdList* list); + void func_5(const void* mhadr, MhdList* list); + void func_6(const void* mhadr, MhdList* list); + void func_7(const void* mhadr, MhdList* list); + void func_8(const void* mhadr, MhdList* list); + void func_9(const void* mhadr, MhdList* list); + void func_10(const void* mhadr, MhdList* list); + void func_11(const void* mhadr, MhdList* list); + void func_12(const void* mhadr, MhdList* list); + void func_13(const void* mhadr, MhdList* list); + void func_14(const void* mhadr, MhdList* list); + void func_15(const void* mhadr, MhdList* list); + void func_16(const void* mhadr, MhdList* list); + void func_17(const void* mhadr, MhdList* list); + void func_18(const void* mhadr, MhdList* list); + void func_19(const void* mhadr, MhdList* list); + void func_20(const void* mhadr, MhdList* list); + void func_21(const void* mhadr, MhdList* list); + void func_22(const void* mhadr, MhdList* list); + void func_23(const void* mhadr, MhdList* list); + void func_24(const void* mhadr, MhdList* list); + void func_25(const void* mhadr, MhdList* list); + void func_26(const void* mhadr, MhdList* list); + void func_27(const void* mhadr, MhdList* list); + void func_28(const void* mhadr, MhdList* list); + void func_29(const void* mhadr, MhdList* list); + void func_30(const void* mhadr, MhdList* list); + void func_31(const void* mhadr, MhdList* list); + void func_32(const void* mhadr, MhdList* list); + void func_33(const void* mhadr, MhdList* list); + void func_34(const void* mhadr, MhdList* list); + void func_35(const void* mhadr, MhdList* list); + void func_36(const void* mhadr, MhdList* list); + void func_37(const void* mhadr, MhdList* list); + void func_38(const void* mhadr, MhdList* list); + void func_39(const void* mhadr, MhdList* list); + void func_40(const void* mhadr, MhdList* list); + void smd_shift(const void* mhadr, MhdList* list); + void func_42(const void* mhadr, MhdList* list); + void func_43(const void* mhadr, MhdList* list); + void func_44(const void* mhadr, MhdList* list); + void func_45(const void* mhadr, MhdList* list); + void func_46(const void* mhadr, MhdList* list); + void func_47(const void* mhadr, MhdList* list); + void func_48(const void* mhadr, MhdList* list); + void func_49(const void* mhadr, MhdList* list); + void func_50(const void* mhadr, MhdList* list); + void func_51(const void* mhadr, MhdList* list); + void func_52(const void* mhadr, MhdList* list); + void func_53(const void* mhadr, MhdList* list); + void func_54(const void* mhadr, MhdList* list); + void func_55(const void* mhadr, MhdList* list); + void func_56(const void* mhadr, MhdList* list); + void func_57(const void* mhadr, MhdList* list); + void func_58(const void* mhadr, MhdList* list); + void func_59(const void* mhadr, MhdList* list); + void func_60(const void* mhadr, MhdList* list); + void func_61(const void* mhadr, MhdList* list); + void func_62(const void* mhadr, MhdList* list); + void func_63(const void* mhadr, MhdList* list); + void func_64(const void* mhadr, MhdList* list); + void func_65(const void* mhadr, MhdList* list); + void func_66(const void* mhadr, MhdList* list); + void func_67(const void* mhadr, MhdList* list); + void func_68(const void* mhadr, MhdList* list); +}; + +enum PpFuncExecFlag { + PPFEF_NONE = 0x00, + PPFEF_BF_SKIP = 0x01, +}; + +struct RobMhPp; + +struct PpFuncDesc { + void (RobMhPp::* func)(const void*, MhpList*, int32_t, const motion_database*); + PpFuncExecFlag exec_flag; +}; + +struct RobMhPp { + rob_chara* impl; + RobBase* base; + RobBase* base_emy; + RobMhSmd smd_class; + + static const PpFuncDesc functbl[]; + + void exec_func(int32_t type, MhpList*& play_prog, int64_t frame, const motion_database* mot_db); + + void func_0( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_1( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_2( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_3( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_4( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_5( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_6( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_7( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_8( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_9( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_10( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_11( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_12( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_13( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_14( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_15( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_16( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_17( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_18( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_19( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_20( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_21( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_22( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_23( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_24( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_25( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_26( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_27( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_28( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_29( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_30( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_31( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_32( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_33( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_34( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_35( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_36( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_37( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_38( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_39( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_40( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_41( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_42( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_43( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_44( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_45( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_46( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_47( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_48( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_49( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_50_set_face_motion_id( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_51( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_52( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_53_set_face_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_54_set_hand_r_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_55_set_hand_l_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_56_set_mouth_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_57_set_eyes_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_58_set_eyelid_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_59_set_rob_chara_head_object( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_60_set_look_camera( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_61_set_eyelid_motion_from_face( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_62_rob_parts_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_63( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_64_osage_reset( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_65_motion_skin_param( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_66_osage_step( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_67_sleeve_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_68( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_69_motion_max_frame( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_70_camera_max_frame( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_71_osage_move_cancel( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_72( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_73_rob_hand_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_74_disable_collision( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_75_rob_adjust_global( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_76_rob_arm_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_77_disable_eye_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_78( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_79_rob_chara_coli_ring( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + void func_80_adjust_get_global_pos( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db); + +}; + struct CmnMotTblBase { int32_t tbl; int32_t kamae_max; @@ -427,7 +674,7 @@ struct rob_chara_age_age_init_data { struct rob_chara_age_age_data { int32_t index; - int32_t part_id; + int32_t part; vec3 pos; float_t field_14; float_t rot_z; @@ -479,7 +726,7 @@ struct rob_chara_age_age_object { void calc_vertex(rob_chara_age_age_object_vertex*& vtx_data, obj_mesh* mesh, const mat4& mat, float_t alpha); - void disp(render_context* rctx, size_t chara_num, + void disp(render_context* rctx, size_t id, bool npr, bool reflect, const vec3& a5, bool chara_color); bool get_objset_info_obj_index(object_info obj_info); ::obj* get_obj_set_obj(); @@ -513,7 +760,7 @@ struct rob_chara_age_age { void ctrl(mat4& mat); void ctrl_data(rob_chara_age_age_data* data, mat4& mat); void ctrl_skip(); - void disp(render_context* rctx, size_t chara_id, + void disp(render_context* rctx, size_t id, bool npr, bool reflect, const vec3& a5, bool chara_color); void load(object_info obj_info, rob_chara_age_age_data* data, int32_t count); void reset(); @@ -554,13 +801,13 @@ struct rob_sleeve_handler { }; struct osage_set_motion { - uint32_t motion_id; + uint32_t motnum; prj::vector_pair frames; osage_set_motion(); ~osage_set_motion(); - void init_frame(uint32_t motion_id, float_t frame, int32_t stage_index); + void init_frame(uint32_t motnum, float_t frame, int32_t stage_index); }; struct skeleton_rotation_offset { @@ -576,7 +823,7 @@ struct skeleton_rotation_offset { class PvOsageManager : app::Task { public: int32_t state; - int32_t chara_id; + ROB_ID rob_id; bool reset; int32_t field_74; uint32_t motion_index; @@ -604,14 +851,14 @@ public: virtual void disp() override; void AddMotionFrameResetData(int32_t stage_index, - uint32_t motion_id, float_t frame, int32_t iterations); - bool CheckResetFrameNotFound(uint32_t motion_id, float_t frame); + uint32_t motnum, float_t frame, int32_t init_cnt); + bool CheckResetFrameNotFound(uint32_t motnum, float_t frame); bool GetDisplay(); bool GetNotReset(); void Reset(); void SetDisplay(bool value); void SetNotReset(bool value); - void SetPvId(int32_t pv_id, int32_t chara_id, bool reset); + void SetPvId(int32_t pv_id, ROB_ID rob_id, bool reset); void SetPvSetMotion(const std::vector& set_motion); void sub_1404F77E0(); @@ -619,7 +866,7 @@ public: void sub_1404F7BD0(bool not_reset); void sub_1404F82F0(); void sub_1404F83A0(::osage_set_motion* a2); - void sub_1404F88A0(uint32_t stage_index, uint32_t motion_id, float_t frame); + void sub_1404F88A0(uint32_t stage_index, uint32_t motnum, float_t frame); void sub_1404F8AA0(); static void ThreadMain(PvOsageManager* pv_osg_mgr); @@ -643,7 +890,7 @@ struct RobThreadParent { RobThreadParent(); ~RobThreadParent(); - void AppendRobCharaFunc(rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)); + void AppendRobCharaFunc(rob_chara* rob_chr, void(*func)(rob_chara*)); void AppendRobThread(RobThread* thread); bool CheckThreadsNotNull(); void sub_14054E0D0(); @@ -658,7 +905,7 @@ struct RobThreadHandler { RobThreadHandler(); ~RobThreadHandler(); - void AppendRobCharaFunc(int32_t chara_id, rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)); + void AppendRobCharaFunc(ROB_ID rob_id, rob_chara* rob_chr, void(*func)(rob_chara*)); void sub_14054E3F0(); }; @@ -683,10 +930,10 @@ public: virtual bool ctrl() override; virtual bool dest() override; - bool AppendFreeReqData(CHARA_NUM chara_num); - bool AppendFreeReqDataObj(CHARA_NUM chara_num, const item_cos_data* cos); - bool AppendLoadReqData(CHARA_NUM chara_num); - bool AppendLoadReqDataObj(CHARA_NUM chara_num, const item_cos_data* cos); + bool AppendFreeReqData(CHARA_NUM cn); + bool AppendFreeReqDataObj(CHARA_NUM cn, const RobItemEquip* item_set); + bool AppendLoadReqData(CHARA_NUM cn); + bool AppendLoadReqDataObj(CHARA_NUM cn, const RobItemEquip* item_set); void AppendLoadedReqData(ReqData* req_data); void AppendLoadedReqDataObj(ReqDataObj* req_data_obj); int32_t CtrlFunc1(); @@ -695,24 +942,17 @@ public: int32_t CtrlFunc4(); void FreeLoadedReqData(ReqData* req_data); void FreeLoadedReqDataObj(ReqDataObj* req_data_obj); - void LoadCharaItem(CHARA_NUM chara_num, - int32_t item_no, void* data, const object_database* obj_db); - bool LoadCharaItemCheckNotRead(CHARA_NUM chara_num, int32_t item_no); - void LoadCharaItems(CHARA_NUM chara_num, - item_cos_data* cos, void* data, const object_database* obj_db); - bool LoadCharaItemsCheckNotRead(CHARA_NUM chara_num, item_cos_data* cos); - bool LoadCharaItemsCheckNotReadParent(CHARA_NUM chara_num, item_cos_data* cos); - void LoadCharaItemsParent(CHARA_NUM chara_num, - item_cos_data* cos, void* data, const object_database* obj_db); - void LoadCharaObjSetMotionSet(CHARA_NUM chara_num, + bool LoadCharaItemsCheckNotRead(CHARA_NUM cn, RobItemEquip* item_set); + bool LoadCharaItemsCheckNotReadParent(CHARA_NUM cn, RobItemEquip* item_set); + void LoadCharaItems(CHARA_NUM cn, + RobItemEquip* item_set, void* data, const object_database* obj_db); + void LoadCharaObjSetMotionSet(CHARA_NUM cn, void* data, const object_database* obj_db, const motion_database* mot_db); - bool LoadCharaObjSetMotionSetCheck(CHARA_NUM chara_num); + bool LoadCharaObjSetMotionSetCheck(CHARA_NUM cn); void ResetReqData(); void ResetReqDataObj(); - void UnloadCharaItem(CHARA_NUM chara_num, int32_t item_no); - void UnloadCharaItems(CHARA_NUM chara_num, item_cos_data* cos); - void UnloadCharaItemsParent(CHARA_NUM chara_num, item_cos_data* cos); - void UnloadCharaObjSetMotionSet(CHARA_NUM chara_num); + void UnloadCharaItems(CHARA_NUM cn, RobItemEquip* item_set); + void UnloadCharaObjSetMotionSet(CHARA_NUM cn); void UnloadLoadedChara(); }; @@ -730,18 +970,18 @@ public: virtual bool dest() override; virtual void disp() override; - virtual bool check_type(rob_chara_type type) = 0; - virtual bool is_frame_dependent() = 0; + virtual bool check_type(RobType type) = 0; + virtual bool sync() = 0; void AppendList(rob_chara* rob_chr, std::list* list); void AppendCtrlCharaList(rob_chara* rob_chr); void AppendFreeCharaList(rob_chara* rob_chr); void AppendInitCharaList(rob_chara* rob_chr); - void FreeList(int8_t* chara_id, std::list* list); + void FreeList(int8_t* id, std::list* list); void FreeCharaLists(); - void FreeCtrlCharaList(int8_t* chara_id); - void FreeFreeCharaList(int8_t* chara_id); - void FreeInitCharaList(int8_t* chara_id); + void FreeCtrlCharaList(int8_t* id); + void FreeFreeCharaList(int8_t* id); + void FreeInitCharaList(int8_t* id); }; class TaskRobPrepareControl : public RobImplTask { @@ -753,8 +993,8 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobPrepareAction : public RobImplTask { @@ -766,8 +1006,8 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobBase : public RobImplTask { @@ -779,8 +1019,8 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobCollision : public RobImplTask { @@ -792,8 +1032,8 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobInfo : public RobImplTask { @@ -805,8 +1045,8 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobMotionModifier : public RobImplTask { @@ -818,8 +1058,8 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobDisp : public RobImplTask { @@ -832,21 +1072,21 @@ public: virtual bool dest() override; virtual void disp() override; - virtual bool check_type(rob_chara_type type) override; - virtual bool is_frame_dependent() override; + virtual bool check_type(RobType type) override; + virtual bool sync() override; }; class TaskRobManager : public app::Task { public: int32_t ctrl_state; int32_t dest_state; - TaskRobPrepareControl rob_prepare_control; - TaskRobPrepareAction rob_prepare_action; - TaskRobBase rob_base; - TaskRobCollision rob_collision; - TaskRobInfo rob_info; - TaskRobMotionModifier rob_motion_modifier; - TaskRobDisp rob_disp; + TaskRobPrepareControl task_rob_prepare_ctrl; + TaskRobPrepareAction task_rob_prepare_act; + TaskRobBase task_rob_base; + TaskRobCollision task_rob_collision; + TaskRobInfo task_rob_info; + TaskRobMotionModifier task_rob_motion_modifier; + TaskRobDisp task_rob_disp; std::list init_chara; std::list load_chara; std::list free_chara; @@ -866,339 +1106,34 @@ public: bool CheckCharaLoaded(rob_chara* rob_chr); bool CheckHasRobCharaLoad(rob_chara* rob_chr); void CheckTypeAppendInitCharaLists(std::list* rob_chr_list); - void FreeLoadedCharaList(int8_t* chara_id); + void FreeLoadedCharaList(int8_t* id); bool GetFreeCharaListEmpty(); bool GetWait(rob_chara* rob_chr); + + void reset_list(); }; -struct rob_manager_rob_impl { +struct RobTaskList { RobImplTask* task; const char* name; + + inline RobTaskList(RobImplTask* task = 0, const char* name = "") : task(task), name(name) {} }; static void bone_data_parent_data_init(bone_data_parent* bone, rob_chara_bone_data* rob_bone_data, const bone_database* bone_data); -static void bone_data_parent_load_bone_database(bone_data_parent* bone, - const std::vector* bones, - const CHAINPOSRADIUS* motion_chain_pos, const CHAINPOSRADIUS* disp_chain_pos); static void bone_data_parent_load_rob_chara(bone_data_parent* bone); -static void mot_interpolate(const mot* a1, float_t frame, float_t* value, - mot_key_set* a4, uint32_t key_set_count, const struc_369* a6); -static uint32_t mot_load_last_key_calc(uint16_t keys_count); -static bool mot_load_file(mot* a1, const mot_data* a2); +static uint32_t get_common_rob_mot(CHARA_NUM cn, uint32_t kamae_type, MOTTABLE_TYPE mottbl_type); static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, - const std::vector* a2); -static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t motion_bone_count, size_t leaf_pos); -static void mot_key_data_init_key_sets(mot_key_data* a1, BONE_KIND type, - size_t motion_bone_count, size_t leaf_pos); -static const mot_data* mot_key_data_load_file(mot_key_data* a1, uint32_t motion_id, const motion_database* mot_db); + const std::vector* body_type_table); +static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t block_max, size_t leaf_pos); +static void mot_key_data_init_key_sets(mot_key_data* a1, BONE_KIND kind, size_t block_max, size_t leaf_pos); +static const mot_data* mot_key_data_load_file(mot_key_data* a1, uint32_t motnum, const motion_database* mot_db); static void mot_key_data_reserve_key_sets(mot_key_data* a1); -static void mothead_func_0(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_1(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_2(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_3(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_4(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_5(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_6(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_7(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_8(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_9(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_10(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_11(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_12(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_13(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_14(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_15(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_16(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_17(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_18(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_19(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_20(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_21(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_22(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_23(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_24(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_25(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_26(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_27(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_28(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_29(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_30(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_31(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_32(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_33(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_34(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_35(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_36(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_37(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_38(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_39(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_40(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_41(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_42(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_43(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_44(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_45(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_46(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_47(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_48(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_49(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_50_set_face_motion_id(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_51(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_52(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_53_set_face_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_54_set_hand_r_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_55_set_hand_l_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_56_set_mouth_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_57_set_eyes_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_58_set_eyelid_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_59_set_rob_chara_head_object(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_60_set_look_camera(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_61_set_eyelid_motion_from_face(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_62_rob_parts_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_63(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_64_osage_reset(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_65_motion_skin_param(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_66_osage_step(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_67_sleeve_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_68(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_69_motion_max_frame(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_70_camera_max_frame(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_71_osage_move_cancel(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_72(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_73_rob_hand_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_74_disable_collision(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_75_rob_adjust_global(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_76_rob_arm_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_77_disable_eye_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_78(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_79_rob_chara_coli_ring(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); -static void mothead_func_80_adjust_get_global_pos(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db); - -static void mothead_mot_func_0(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_1(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_2(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_3(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_4(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_5(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_6(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_7(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_8(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_9(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_10(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_11(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_12(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_13(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_14(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_15(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_16(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_17(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_18(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_19(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_20(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_21(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_22(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_23(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_24(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_25(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_26(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_27(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_28(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_29(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_30(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_31(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_32(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_33(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_34(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_35(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_36(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_37(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_38(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_39(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_40(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_41(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_42(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_43(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_44(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_45(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_46(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_47(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_48(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_49(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_50(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_51(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_52(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_53(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_54(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_55(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_56(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_57(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_58(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_59(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_60(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_61(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_62(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_63(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_64(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_65(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_66(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_67(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); -static void mothead_mot_func_68(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data); - -static PvOsageManager* pv_osage_manager_array_get(int32_t chara_id); +static PvOsageManager* pv_osage_manager_array_get(ROB_ID rob_id); static void rob_base_rob_chara_init(rob_chara* rob_chr); static void rob_base_rob_chara_ctrl(rob_chara* rob_chr); @@ -1216,94 +1151,95 @@ static void rob_chara_set_hand_l_object(rob_chara* rob_chr, object_info obj_info static void rob_chara_set_hand_r_object(rob_chara* rob_chr, object_info obj_info, int32_t type); static void rob_chara_age_age_ctrl(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, mat4& mat); + int32_t rob_id, int32_t part, mat4& mat); static void rob_chara_age_age_disp(rob_chara_age_age* arr, - render_context* rctx, int32_t chara_id, bool reflect, bool chara_color); + render_context* rctx, int32_t rob_id, bool reflect, bool chara_color); static void rob_chara_age_age_load(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id); -static void rob_chara_age_age_reset(rob_chara_age_age* arr, int32_t chara_id); + int32_t rob_id, int32_t part); +static void rob_chara_age_age_reset(rob_chara_age_age* arr, int32_t rob_id); static void rob_chara_age_age_set_alpha(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value); + int32_t rob_id, int32_t part, float_t value); static void rob_chara_age_age_set_disp(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, bool value); + int32_t rob_id, int32_t part, bool value); static void rob_chara_age_age_set_move_cancel(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value); + int32_t rob_id, int32_t part, float_t value); static void rob_chara_age_age_set_npr(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, bool value); + int32_t rob_id, int32_t part, bool value); static void rob_chara_age_age_set_speed(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value); + int32_t rob_id, int32_t part, float_t value); static void rob_chara_age_age_set_skip(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id); + int32_t rob_id, int32_t part); static void rob_chara_age_age_set_step(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value); + int32_t rob_id, int32_t part, float_t value); static void rob_chara_age_age_set_step_full(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id); + int32_t rob_id, int32_t part); static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, - const std::vector* bones); -static void rob_chara_bone_data_get_ik_scale( + const std::vector* body_type_table); +static void rob_chara_bone_data_get_adjust_scale( rob_chara_bone_data* rob_bone_data, const bone_database* bone_data); static mat4* rob_chara_bone_data_get_mat(rob_chara_bone_data* rob_bone_data, size_t index); static RobNode* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_data, size_t index); -static void rob_chara_bone_data_ik_scale_calculate( - rob_chara_bone_data_ik_scale* ik_scale, prj::sys_vector& bones, - BONE_KIND base_skeleton_type, BONE_KIND skeleton_type, const bone_database* bone_data); +static void rob_chara_bone_data_adjust_scale_calculate( + rob_chara_bone_data_adjust_scale* adjust_scale, prj::sys_vector& block_vec, + BONE_KIND kind, BONE_KIND disp_kind, const bone_database* bone_data); static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, - BONE_KIND base_skeleton_type, BONE_KIND skeleton_type, const bone_database* bone_data); + BONE_KIND kind, BONE_KIND disp_kind, const bone_database* bone_data); static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, - BONE_KIND base_skeleton_type, BONE_KIND skeleton_type, const bone_database* bone_data); + BONE_KIND kind, BONE_KIND disp_kind, const bone_database* bone_data); static void rob_chara_bone_data_motion_blend_mot_free(rob_chara_bone_data* rob_bone_data); static void rob_chara_bone_data_motion_blend_mot_init(rob_chara_bone_data* rob_bone_data); static void rob_chara_bone_data_motion_blend_mot_list_free(rob_chara_bone_data* rob_bone_data, size_t last_index); static void rob_chara_bone_data_motion_blend_mot_list_init(rob_chara_bone_data* rob_bone_data); static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, - uint32_t motion_id, MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db); + uint32_t motnum, MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db); static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data); static void rob_chara_bone_data_set_look_anim_param(rob_chara_bone_data* rob_bone_data, const rob_chara_look_anim_eye_param* params, const eyes_adjust* eyes_adjust); static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, - const std::vector* bones, const std::string* motion_bones); + const std::vector* body_type_table, const std::string* bone_node_name_table); static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, - const uint16_t* parent_indices); -static void rob_chara_bone_data_set_rot_y(rob_chara_bone_data* rob_bone_data, float_t rot_y); -static void rob_chara_bone_data_set_step(rob_chara_bone_data* rob_bone_data, float_t step); + const uint16_t* node_parent_table); +static void rob_chara_bone_data_set_yrot(rob_chara_bone_data* rob_bone_data, float_t value); +static void rob_chara_bone_data_set_step(rob_chara_bone_data* rob_bone_data, float_t value); -static void rob_chara_age_age_ctrl(rob_chara* rob_chr, int32_t part_id, const char* name); +static void rob_chara_age_age_ctrl(rob_chara* rob_chr, int32_t part, const char* name); static object_info rob_chara_get_head_object(rob_chara* rob_chr, int32_t head_object_id); static object_info rob_chara_get_object_info(rob_chara* rob_chr, ROB_PARTS_KIND rpk); static void rob_chara_load_default_motion(rob_chara* rob_chr, const bone_database* bone_data, const motion_database* mot_db); -static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skeleton_select, - uint32_t motion_id, const bone_database* bone_data, const motion_database* mot_db); +static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t motion_body_type, + uint32_t motnum, const bone_database* bone_data, const motion_database* mot_db); static void rob_chara_set_adjust(rob_chara* rob_chr, rob_chara_data_adjust* adjust_new, rob_chara_data_adjust* adjust, rob_chara_data_adjust* adjust_prev); -static void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, - CHARA_NUM chara_num, int32_t cos_id, const rob_chara_pv_data& pv_data); static void rob_cmn_mottbl_read(void* a1, const void* data, size_t size); -static void opd_chara_data_array_add_frame_data(int32_t chara_id); -static void opd_chara_data_array_encode_data(int32_t chara_id); -static void opd_chara_data_array_encode_init_data(int32_t chara_id, uint32_t motion_id); -static void opd_chara_data_array_fs_copy_file(int32_t chara_id); -static opd_chara_data* opd_chara_data_array_get(int32_t chara_id); -static void opd_chara_data_array_init_data(int32_t chara_id, uint32_t motion_id); -static void opd_chara_data_array_open_opd_file(int32_t chara_id); -static void opd_chara_data_array_open_opdi_file(int32_t chara_id); -static void opd_chara_data_array_write_file(int32_t chara_id); +static void opd_chara_data_array_add_frame_data(ROB_ID rob_id); +static void opd_chara_data_array_encode_data(ROB_ID rob_id); +static void opd_chara_data_array_encode_init_data(ROB_ID rob_id, uint32_t motnum); +static void opd_chara_data_array_fs_copy_file(ROB_ID rob_id); +static opd_chara_data* opd_chara_data_array_get(ROB_ID rob_id); +static void opd_chara_data_array_init_data(ROB_ID rob_id, uint32_t motnum); +static void opd_chara_data_array_open_opd_file(ROB_ID rob_id); +static void opd_chara_data_array_open_opdi_file(ROB_ID rob_id); +static void opd_chara_data_array_write_file(ROB_ID rob_id); -static rob_manager_rob_impl* rob_manager_rob_impls1_get(TaskRobManager* rob_mgr); -static rob_manager_rob_impl* rob_manager_rob_impls2_get(TaskRobManager* rob_mgr); +static const RobTaskList* get_rob_manager_list_before(TaskRobManager* task_rob_mgr); +static const RobTaskList* get_rob_manager_list_after(TaskRobManager* task_rob_mgr); -rob_chara* rob_chara_array; -rob_chara_pv_data* rob_chara_pv_data_array; +int32_t RobItem::s_have_dbg_ref; +RobItemHave RobItem::s_have_dbg[CN_MAX]; +int32_t RobItem::s_have_sub_dbg_ref; +RobItemHaveSub RobItem::s_have_sub_dbg[CN_MAX]; -rob_manager_rob_impl rob_manager_rob_impls1[2]; -bool rob_manager_rob_impls1_init = false; -rob_manager_rob_impl rob_manager_rob_impls2[7]; -bool rob_manager_rob_impls2_init = false; +bool RobManagement::colli_check_on = true; +CHARA_NUM RobManagement::chara_num[ROB_ID_MAX]; +int32_t RobManagement::instance_count; +rob_chara RobManagement::rob_impl[ROB_ID_MAX]; +RobInit RobManagement::rob_init[ROB_ID_MAX]; opd_chara_data* opd_chara_data_array; OpdChecker* opd_checker; @@ -1329,162 +1265,162 @@ static int32_t opd_maker_counter = 0; static int32_t osage_test_no_pause = 0; static int32_t pv_osage_manager_counter = 0; static int32_t rob_thread_parent_counter = 0; -static int32_t rob_chara_item_equip_object_disable_node_blocks = 0; +static int32_t rob_skin_disp_disable_node_blocks = 0; -static const mothead_func_struct mothead_func_array[] = { - { mothead_func_0 , 1 }, - { mothead_func_1 , 1 }, - { mothead_func_2 , 0 }, - { mothead_func_3 , 0 }, - { mothead_func_4 , 0 }, - { mothead_func_5 , 0 }, - { mothead_func_6 , 0 }, - { mothead_func_7 , 0 }, - { mothead_func_8 , 1 }, - { mothead_func_9 , 0 }, - { mothead_func_10, 0 }, - { mothead_func_11, 0 }, - { mothead_func_12, 0 }, - { mothead_func_13, 0 }, - { mothead_func_14, 0 }, - { mothead_func_15, 0 }, - { mothead_func_16, 0 }, - { mothead_func_17, 0 }, - { mothead_func_18, 0 }, - { mothead_func_19, 0 }, - { mothead_func_20, 0 }, - { mothead_func_21, 0 }, - { mothead_func_22, 0 }, - { mothead_func_23, 0 }, - { mothead_func_24, 0 }, - { mothead_func_25, 1 }, - { mothead_func_26, 0 }, - { mothead_func_27, 0 }, - { mothead_func_28, 0 }, - { mothead_func_29, 0 }, - { mothead_func_30, 0 }, - { mothead_func_31, 1 }, - { mothead_func_32, 0 }, - { mothead_func_33, 0 }, - { mothead_func_34, 0 }, - { mothead_func_35, 0 }, - { mothead_func_36, 0 }, - { mothead_func_37, 0 }, - { mothead_func_38, 0 }, - { mothead_func_39, 0 }, - { mothead_func_40, 0 }, - { mothead_func_41, 0 }, - { mothead_func_42, 0 }, - { mothead_func_43, 0 }, - { mothead_func_44, 0 }, - { mothead_func_45, 0 }, - { mothead_func_46, 0 }, - { mothead_func_47, 0 }, - { mothead_func_48, 0 }, - { mothead_func_49, 0 }, - { mothead_func_50_set_face_motion_id, 0 }, - { mothead_func_51, 0 }, - { mothead_func_52, 0 }, - { mothead_func_53_set_face_mottbl_motion, 0 }, - { mothead_func_54_set_hand_r_mottbl_motion, 0 }, - { mothead_func_55_set_hand_l_mottbl_motion, 0 }, - { mothead_func_56_set_mouth_mottbl_motion, 0 }, - { mothead_func_57_set_eyes_mottbl_motion, 0 }, - { mothead_func_58_set_eyelid_mottbl_motion, 0 }, - { mothead_func_59_set_rob_chara_head_object, 0 }, - { mothead_func_60_set_look_camera, 0 }, - { mothead_func_61_set_eyelid_motion_from_face, 0 }, - { mothead_func_62_rob_parts_adjust, 0 }, - { mothead_func_63, 0 }, - { mothead_func_64_osage_reset, 0 }, - { mothead_func_65_motion_skin_param, 0 }, - { mothead_func_66_osage_step, 0 }, - { mothead_func_67_sleeve_adjust, 0 }, - { mothead_func_68, 0 }, - { mothead_func_69_motion_max_frame, 0 }, - { mothead_func_70_camera_max_frame, 0 }, - { mothead_func_71_osage_move_cancel, 0 }, - { mothead_func_72, 0 }, - { mothead_func_73_rob_hand_adjust, 0 }, - { mothead_func_74_disable_collision, 0 }, - { mothead_func_75_rob_adjust_global, 0 }, - { mothead_func_76_rob_arm_adjust, 0 }, - { mothead_func_77_disable_eye_motion, 0 }, - { mothead_func_78, 0 }, - { mothead_func_79_rob_chara_coli_ring, 0 }, - { mothead_func_80_adjust_get_global_pos, 0 }, +const PpFuncDesc RobMhPp::functbl[] = { + { &RobMhPp::func_0 , PPFEF_BF_SKIP }, + { &RobMhPp::func_1 , PPFEF_BF_SKIP }, + { &RobMhPp::func_2 , PPFEF_NONE }, + { &RobMhPp::func_3 , PPFEF_NONE }, + { &RobMhPp::func_4 , PPFEF_NONE }, + { &RobMhPp::func_5 , PPFEF_NONE }, + { &RobMhPp::func_6 , PPFEF_NONE }, + { &RobMhPp::func_7 , PPFEF_NONE }, + { &RobMhPp::func_8 , PPFEF_BF_SKIP }, + { &RobMhPp::func_9 , PPFEF_NONE }, + { &RobMhPp::func_10, PPFEF_NONE }, + { &RobMhPp::func_11, PPFEF_NONE }, + { &RobMhPp::func_12, PPFEF_NONE }, + { &RobMhPp::func_13, PPFEF_NONE }, + { &RobMhPp::func_14, PPFEF_NONE }, + { &RobMhPp::func_15, PPFEF_NONE }, + { &RobMhPp::func_16, PPFEF_NONE }, + { &RobMhPp::func_17, PPFEF_NONE }, + { &RobMhPp::func_18, PPFEF_NONE }, + { &RobMhPp::func_19, PPFEF_NONE }, + { &RobMhPp::func_20, PPFEF_NONE }, + { &RobMhPp::func_21, PPFEF_NONE }, + { &RobMhPp::func_22, PPFEF_NONE }, + { &RobMhPp::func_23, PPFEF_NONE }, + { &RobMhPp::func_24, PPFEF_NONE }, + { &RobMhPp::func_25, PPFEF_BF_SKIP }, + { &RobMhPp::func_26, PPFEF_NONE }, + { &RobMhPp::func_27, PPFEF_NONE }, + { &RobMhPp::func_28, PPFEF_NONE }, + { &RobMhPp::func_29, PPFEF_NONE }, + { &RobMhPp::func_30, PPFEF_NONE }, + { &RobMhPp::func_31, PPFEF_BF_SKIP }, + { &RobMhPp::func_32, PPFEF_NONE }, + { &RobMhPp::func_33, PPFEF_NONE }, + { &RobMhPp::func_34, PPFEF_NONE }, + { &RobMhPp::func_35, PPFEF_NONE }, + { &RobMhPp::func_36, PPFEF_NONE }, + { &RobMhPp::func_37, PPFEF_NONE }, + { &RobMhPp::func_38, PPFEF_NONE }, + { &RobMhPp::func_39, PPFEF_NONE }, + { &RobMhPp::func_40, PPFEF_NONE }, + { &RobMhPp::func_41, PPFEF_NONE }, + { &RobMhPp::func_42, PPFEF_NONE }, + { &RobMhPp::func_43, PPFEF_NONE }, + { &RobMhPp::func_44, PPFEF_NONE }, + { &RobMhPp::func_45, PPFEF_NONE }, + { &RobMhPp::func_46, PPFEF_NONE }, + { &RobMhPp::func_47, PPFEF_NONE }, + { &RobMhPp::func_48, PPFEF_NONE }, + { &RobMhPp::func_49, PPFEF_NONE }, + { &RobMhPp::func_50_set_face_motion_id, PPFEF_NONE }, + { &RobMhPp::func_51, PPFEF_NONE }, + { &RobMhPp::func_52, PPFEF_NONE }, + { &RobMhPp::func_53_set_face_mottbl_motion, PPFEF_NONE }, + { &RobMhPp::func_54_set_hand_r_mottbl_motion, PPFEF_NONE }, + { &RobMhPp::func_55_set_hand_l_mottbl_motion, PPFEF_NONE }, + { &RobMhPp::func_56_set_mouth_mottbl_motion, PPFEF_NONE }, + { &RobMhPp::func_57_set_eyes_mottbl_motion, PPFEF_NONE }, + { &RobMhPp::func_58_set_eyelid_mottbl_motion, PPFEF_NONE }, + { &RobMhPp::func_59_set_rob_chara_head_object, PPFEF_NONE }, + { &RobMhPp::func_60_set_look_camera, PPFEF_NONE }, + { &RobMhPp::func_61_set_eyelid_motion_from_face, PPFEF_NONE }, + { &RobMhPp::func_62_rob_parts_adjust, PPFEF_NONE }, + { &RobMhPp::func_63, PPFEF_NONE }, + { &RobMhPp::func_64_osage_reset, PPFEF_NONE }, + { &RobMhPp::func_65_motion_skin_param, PPFEF_NONE }, + { &RobMhPp::func_66_osage_step, PPFEF_NONE }, + { &RobMhPp::func_67_sleeve_adjust, PPFEF_NONE }, + { &RobMhPp::func_68, PPFEF_NONE }, + { &RobMhPp::func_69_motion_max_frame, PPFEF_NONE }, + { &RobMhPp::func_70_camera_max_frame, PPFEF_NONE }, + { &RobMhPp::func_71_osage_move_cancel, PPFEF_NONE }, + { &RobMhPp::func_72, PPFEF_NONE }, + { &RobMhPp::func_73_rob_hand_adjust, PPFEF_NONE }, + { &RobMhPp::func_74_disable_collision, PPFEF_NONE }, + { &RobMhPp::func_75_rob_adjust_global, PPFEF_NONE }, + { &RobMhPp::func_76_rob_arm_adjust, PPFEF_NONE }, + { &RobMhPp::func_77_disable_eye_motion, PPFEF_NONE }, + { &RobMhPp::func_78, PPFEF_NONE }, + { &RobMhPp::func_79_rob_chara_coli_ring, PPFEF_NONE }, + { &RobMhPp::func_80_adjust_get_global_pos, PPFEF_NONE }, }; -static const mothead_mot_func mothead_mot_func_array[] = { - mothead_mot_func_0, - mothead_mot_func_1, - mothead_mot_func_2, - mothead_mot_func_3, - mothead_mot_func_4, - mothead_mot_func_5, - mothead_mot_func_6, - mothead_mot_func_7, - mothead_mot_func_8, - mothead_mot_func_9, - mothead_mot_func_10, - mothead_mot_func_11, - mothead_mot_func_12, - mothead_mot_func_13, - mothead_mot_func_14, - mothead_mot_func_15, - mothead_mot_func_16, - mothead_mot_func_17, - mothead_mot_func_18, - mothead_mot_func_19, - mothead_mot_func_20, - mothead_mot_func_21, - mothead_mot_func_22, - mothead_mot_func_23, - mothead_mot_func_24, - mothead_mot_func_25, - mothead_mot_func_26, - mothead_mot_func_27, - mothead_mot_func_28, - mothead_mot_func_29, - mothead_mot_func_30, - mothead_mot_func_31, - mothead_mot_func_32, - mothead_mot_func_33, - mothead_mot_func_34, - mothead_mot_func_35, - mothead_mot_func_36, - mothead_mot_func_37, - mothead_mot_func_38, - mothead_mot_func_39, - mothead_mot_func_40, - mothead_mot_func_41, - mothead_mot_func_42, - mothead_mot_func_43, - mothead_mot_func_44, - mothead_mot_func_45, - mothead_mot_func_46, - mothead_mot_func_47, - mothead_mot_func_48, - mothead_mot_func_49, - mothead_mot_func_40, - mothead_mot_func_51, - mothead_mot_func_52, - mothead_mot_func_53, - mothead_mot_func_54, - mothead_mot_func_55, - mothead_mot_func_56, - mothead_mot_func_57, - mothead_mot_func_58, - mothead_mot_func_59, - mothead_mot_func_60, - mothead_mot_func_61, - mothead_mot_func_62, - mothead_mot_func_63, - mothead_mot_func_64, - mothead_mot_func_65, - mothead_mot_func_66, - mothead_mot_func_67, - mothead_mot_func_68, +const SmdFunc RobMhSmd::functbl[] = { + &RobMhSmd::smd_next, + &RobMhSmd::func_1, + &RobMhSmd::func_2, + &RobMhSmd::func_3, + &RobMhSmd::func_4, + &RobMhSmd::func_5, + &RobMhSmd::func_6, + &RobMhSmd::func_7, + &RobMhSmd::func_8, + &RobMhSmd::func_9, + &RobMhSmd::func_10, + &RobMhSmd::func_11, + &RobMhSmd::func_12, + &RobMhSmd::func_13, + &RobMhSmd::func_14, + &RobMhSmd::func_15, + &RobMhSmd::func_16, + &RobMhSmd::func_17, + &RobMhSmd::func_18, + &RobMhSmd::func_19, + &RobMhSmd::func_20, + &RobMhSmd::func_21, + &RobMhSmd::func_22, + &RobMhSmd::func_23, + &RobMhSmd::func_24, + &RobMhSmd::func_25, + &RobMhSmd::func_26, + &RobMhSmd::func_27, + &RobMhSmd::func_28, + &RobMhSmd::func_29, + &RobMhSmd::func_30, + &RobMhSmd::func_31, + &RobMhSmd::func_32, + &RobMhSmd::func_33, + &RobMhSmd::func_34, + &RobMhSmd::func_35, + &RobMhSmd::func_36, + &RobMhSmd::func_37, + &RobMhSmd::func_38, + &RobMhSmd::func_39, + &RobMhSmd::func_40, + &RobMhSmd::smd_shift, + &RobMhSmd::func_42, + &RobMhSmd::func_43, + &RobMhSmd::func_44, + &RobMhSmd::func_45, + &RobMhSmd::func_46, + &RobMhSmd::func_47, + &RobMhSmd::func_48, + &RobMhSmd::func_49, + &RobMhSmd::func_40, + &RobMhSmd::func_51, + &RobMhSmd::func_52, + &RobMhSmd::func_53, + &RobMhSmd::func_54, + &RobMhSmd::func_55, + &RobMhSmd::func_56, + &RobMhSmd::func_57, + &RobMhSmd::func_58, + &RobMhSmd::func_59, + &RobMhSmd::func_60, + &RobMhSmd::func_61, + &RobMhSmd::func_62, + &RobMhSmd::func_63, + &RobMhSmd::func_64, + &RobMhSmd::func_65, + &RobMhSmd::func_66, + &RobMhSmd::func_67, + &RobMhSmd::func_68, }; static const RobCollisionData MIKU_cb_tbl[] = { @@ -2123,12 +2059,12 @@ static const RobData rob_data[] = { } }; -static const BONE_BLK rob_ik_hand_leg_bones[] = { +static const BONE_BLK lc_part_block_tbl[] = { BLK_C_KATA_R, BLK_C_KATA_L, BLK_CL_MOMO_R, BLK_CL_MOMO_L, }; -static const BONE_BLK dword_140A2DC90[] = { +static const BONE_BLK c_kata_r_ik_blk_tbl[] = { BLK_C_KATA_R, BLK_KL_TE_R_WJ, BLK_N_HITO_R_EX, BLK_NL_HITO_R_WJ, BLK_NL_HITO_B_R_WJ, BLK_NL_HITO_C_R_WJ, BLK_N_KO_R_EX, BLK_NL_KO_R_WJ, BLK_NL_KO_B_R_WJ, @@ -2142,7 +2078,7 @@ static const BONE_BLK dword_140A2DC90[] = { BLK_N_SKATA_C_R_WJ_CD_CU_EX, BLK_DUMMY }; -static const BONE_BLK dword_140A2DD10[] = { +static const BONE_BLK c_kata_l_ik_blk_tbl[] = { BLK_C_KATA_L, BLK_KL_TE_L_WJ, BLK_N_HITO_L_EX, BLK_NL_HITO_L_WJ, BLK_NL_HITO_B_L_WJ, BLK_NL_HITO_C_L_WJ, BLK_N_KO_L_EX, BLK_NL_KO_L_WJ, BLK_NL_KO_B_L_WJ, @@ -2156,19 +2092,19 @@ static const BONE_BLK dword_140A2DD10[] = { BLK_N_SKATA_C_L_WJ_CD_CU_EX, BLK_DUMMY }; -static const BONE_BLK dword_140A2DD90[] = { +static const BONE_BLK c_momo_r_ik_blk_tbl[] = { BLK_CL_MOMO_R, BLK_KL_ASI_R_WJ_CO, BLK_KL_TOE_R_WJ, BLK_N_HIZA_R_WJ_EX, BLK_N_MOMO_A_R_WJ_CD_EX, BLK_N_MOMO_B_R_WJ_EX, BLK_N_MOMO_C_R_WJ_EX, BLK_DUMMY }; -static const BONE_BLK dword_140A2DDB0[] = { +static const BONE_BLK c_momo_l_ik_blk_tbl[] = { BLK_CL_MOMO_L, BLK_KL_ASI_L_WJ_CO, BLK_KL_TOE_L_WJ, BLK_N_HIZA_L_WJ_EX, BLK_N_MOMO_A_L_WJ_CD_EX, BLK_N_MOMO_B_L_WJ_EX, BLK_N_MOMO_C_L_WJ_EX, BLK_DUMMY }; -static const BONE_ID dword_140A2DDD0[] = { +static const BONE_ID lc_target_bone_tbl[] = { BONE_ID_DUMMY, BONE_ID_KL_TE_R_WJ, BONE_ID_KL_TE_L_WJ, BONE_ID_KL_ASI_R_WJ_CO, BONE_ID_KL_ASI_L_WJ_CO, BONE_ID_J_SUNE_R_WJ, BONE_ID_J_SUNE_L_WJ, BONE_ID_UDE_R_WJ, BONE_ID_UDE_L_WJ, BONE_ID_CL_KAO, BONE_ID_DUMMY, @@ -2178,24 +2114,26 @@ static const BONE_ID dword_140A2DDD0[] = { BONE_ID_UDE_R_WJ, BONE_ID_UDE_L_WJ, BONE_ID_CL_KAO, BONE_ID_DUMMY, }; -static const BONE_BLK rob_motion_c_kata_bones[] = { +static const BONE_BLK lc_arm_block_tbl[] = { BLK_C_KATA_L, BLK_C_KATA_R, }; -static const BONE_ID rob_kl_te_bones[] = { +static const BONE_ID lc_target_arm_tbl[] = { BONE_ID_KL_TE_L_WJ, BONE_ID_KL_TE_R_WJ }; -static const BONE_BLK* off_140C9E000[] = { - dword_140A2DC90, - dword_140A2DD10, +static const BONE_BLK* recalc_ik_block_tbl[] = { + c_kata_r_ik_blk_tbl, + c_kata_l_ik_blk_tbl, + c_momo_r_ik_blk_tbl, + c_momo_l_ik_blk_tbl, }; -static const BONE_BLK* off_140C9E020[] = { - dword_140A2DD10, - dword_140A2DC90, +static const BONE_BLK* recalc_flip_ik_block_tbl[] = { + c_kata_l_ik_blk_tbl, + c_kata_r_ik_blk_tbl, }; static const skeleton_rotation_offset skeleton_rotation_offset_array[] = { @@ -2412,394 +2350,1109 @@ const rob_chara_age_age_init_data rob_chara_age_age_init_data_right[] = { { { 0.264f, 0.00f, -0.040f }, 2.20f, 0.124f, 0.0025f, 1.40f, 0.01f, 0.0f, 180.0f, 90.0f }, }; +const int16_t leaf_ctrl_part_mirror_tbl[] = { + LCPART_TE_L, + LCPART_TE_R, + LCPART_ASI_L, + LCPART_ASI_R, + LCPART_MAX, +}; + +const int16_t leaf_ctrl_target_mirror_tbl[] = { + LCTAG_ABS, + LCTAG_TE_L, + LCTAG_TE_R, + LCTAG_ASI_L, + LCTAG_ASI_R, + LCTAG_SUNE_L, + LCTAG_SUNE_R, + LCTAG_UDE_L, + LCTAG_UDE_R, + LCTAG_KAO, + LCTAG_ADJ_EMY, + LCTAG_ADJ_EMY_BODY, + LCTAG_ADJ_EMY_HEIGHT, + LCTAG_ADJ_REV, + LCTAG_ADJ_BODY_REV, + LCTAG_ADJ_HEIGHT_REV, + LCTAG_OFS, + LCTAG_OFS_TE_L, + LCTAG_OFS_TE_R, + LCTAG_OFS_ASI_L, + LCTAG_OFS_ASI_R, + LCTAG_OFS_SUNE_L, + LCTAG_OFS_SUNE_R, + LCTAG_OFS_UDE_L, + LCTAG_OFS_UDE_R, + LCTAG_OFS_KAO, + LCTAG_OFS_BODY, + LCTAG_MAX, +}; + +const bool leaf_ctrl_tagofs_mirror_flip_tbl[][3] = { + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 1, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 1, 0, 0 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 0, 1 }, + { 0, 1, 0 }, + { 1, 0, 0 }, + { 0, 0, 0 }, +}; + +const ROB_ITEM_EQUIP_SUB_ID equip_sub_id_phase2[] = { + ROB_ITEM_EQUIP_SUB_ID_ZUJO, ROB_ITEM_EQUIP_SUB_ID_KAMI, ROB_ITEM_EQUIP_SUB_ID_HITAI, + ROB_ITEM_EQUIP_SUB_ID_ME, ROB_ITEM_EQUIP_SUB_ID_MEGANE, ROB_ITEM_EQUIP_SUB_ID_MIMI, + ROB_ITEM_EQUIP_SUB_ID_KUCHI, ROB_ITEM_EQUIP_SUB_ID_MAKI, ROB_ITEM_EQUIP_SUB_ID_KUBI, + ROB_ITEM_EQUIP_SUB_ID_INNER, ROB_ITEM_EQUIP_SUB_ID_KATA, ROB_ITEM_EQUIP_SUB_ID_U_UDE, + ROB_ITEM_EQUIP_SUB_ID_L_UDE, ROB_ITEM_EQUIP_SUB_ID_JOHA_MAE, ROB_ITEM_EQUIP_SUB_ID_JOHA_USHIRO, + ROB_ITEM_EQUIP_SUB_ID_BELT, ROB_ITEM_EQUIP_SUB_ID_KOSI, ROB_ITEM_EQUIP_SUB_ID_SUNE, + ROB_ITEM_EQUIP_SUB_ID_KUTSU, ROB_ITEM_EQUIP_SUB_ID_HEAD, ROB_ITEM_EQUIP_SUB_ID_MAX, +}; + +const ROB_ITEM_EQUIP_SUB_ID equip_sub_id_phase3[] = { + ROB_ITEM_EQUIP_SUB_ID_TE, ROB_ITEM_EQUIP_SUB_ID_ASI, ROB_ITEM_EQUIP_SUB_ID_MAX, +}; + +const ROB_ITEM_EQUIP_SUB_ID equip_sub_id_phase4[] = { + ROB_ITEM_EQUIP_SUB_ID_PANTS, ROB_ITEM_EQUIP_SUB_ID_OUTER, ROB_ITEM_EQUIP_SUB_ID_MAX, +}; + +const ROB_PARTS_KIND rpk_item[] = { + RPK_ZUJO, RPK_KAMI, RPK_NONE, RPK_NONE, + RPK_MEGANE, RPK_NONE, RPK_KUCHI, RPK_NONE, + RPK_KUBI, RPK_NONE, RPK_OUTER, RPK_NONE, + RPK_NONE, RPK_NONE, RPK_NONE, RPK_NONE, + RPK_JOHA_USHIRO, RPK_NONE, RPK_NONE, RPK_PANTS, + RPK_NONE, RPK_NONE, RPK_NONE, RPK_NONE, + RPK_NONE, +}; + +static const ROB_ITEM_EQUIP_ID equip_id_conv_table[] = { + ROB_ITEM_EQUIP_ID_ATAM, ROB_ITEM_EQUIP_ID_ATAM, ROB_ITEM_EQUIP_ID_ATAM, + ROB_ITEM_EQUIP_ID_KAO, ROB_ITEM_EQUIP_ID_KAO, ROB_ITEM_EQUIP_ID_KAO, + ROB_ITEM_EQUIP_ID_KAO, ROB_ITEM_EQUIP_ID_KAO, ROB_ITEM_EQUIP_ID_JOHA, + ROB_ITEM_EQUIP_ID_JOHA, ROB_ITEM_EQUIP_ID_JOHA, ROB_ITEM_EQUIP_ID_UDE, + ROB_ITEM_EQUIP_ID_UDE, ROB_ITEM_EQUIP_ID_UDE, ROB_ITEM_EQUIP_ID_UDE, + ROB_ITEM_EQUIP_ID_JOHA, ROB_ITEM_EQUIP_ID_JOHA, ROB_ITEM_EQUIP_ID_KAHA, + ROB_ITEM_EQUIP_ID_KAHA, ROB_ITEM_EQUIP_ID_KAHA, ROB_ITEM_EQUIP_ID_KAHA, + ROB_ITEM_EQUIP_ID_KAHA, ROB_ITEM_EQUIP_ID_KAHA, ROB_ITEM_EQUIP_ID_JOHA, + ROB_ITEM_EQUIP_ID_KAO, +}; + extern render_context* rctx_ptr; extern uint32_t cmn_set_id; -const RobData* get_rob_data(CHARA_NUM cn) { - if (cn >= 0 && cn < CN_MAX) - return &rob_data[cn]; - return 0; +static RobManagement s_rob_management; + +RobTransform::RobTransform() { + pos = 0.0f; + rot = 0.0f; + scale = 1.0f; + hsc = 1.0f; } -int32_t rob_data_get_chara_size_index(CHARA_NUM cn) { - const RobData* rob_data = get_rob_data(cn); - if (rob_data) - return rob_data->field_848.chara_size_index; - return 1; +void RobTransform::CalcMatrixHS(const vec3& hsc, mat4& mat, mat4& dsp_mat) { + vec3 pos = this->pos * hsc; + mat4_mul_translate(&mat, &pos, &mat); + mat4_mul_rotate_zyx(&mat, &rot, &mat); + this->hsc = scale * hsc; + dsp_mat = mat; + mat4_scale_rot(&dsp_mat, &this->hsc, &dsp_mat); } -int32_t rob_data_get_swim_costume(CHARA_NUM cn) { - const RobData* RobData = get_rob_data(cn); - if (rob_data) - return rob_data->field_848.swim_costume; - return 0; +void RobTransform::init() { + pos = 0.0f; + rot = 0.0f; + scale = 1.0f; + hsc = 1.0f; } -int32_t rob_data_get_swim_s_costume(CHARA_NUM cn) { - const RobData* RobData = get_rob_data(cn); - if (rob_data) - return rob_data->field_848.swim_s_costume; - return 0; +void RobTransform::init(const vec3& p, const vec3& r) { + pos = p; + rot = r; + scale = 1.0f; + hsc = 1.0f; } -float_t chara_size_table_get_value(uint32_t index) { - static const float_t chara_size_table[] = { - 1.07f, 1.0f, 0.96f, 0.987f, 1.025f, 1.045f - }; - - if (index >= 0 && index < 5) - return chara_size_table[index]; - return 1.0f; +void RobTransform::init(float_t px, float_t py, float_t pz, + float_t rx, float_t ry, float_t rz) { + pos.x = px; + pos.y = py; + pos.z = pz; + rot.x = rx; + rot.z = ry; + rot.y = rz; + scale = 1.0f; + hsc = 1.0f; } -float_t chara_pos_adjust_y_table_get_value(uint32_t index) { - static const float_t chara_pos_adjust_y_table[] = { - 0.071732f, 0.0f, -0.03859f, 0.0f, 0.0f - }; - - if (index >= 0 && index < 5) - return chara_pos_adjust_y_table[index]; - return 0.0f; +void RobTransform::reset_scale() { + scale = 1.0f; + hsc = 1.0f; } -bool check_cos_id_is_501(int32_t cos_id) { - if (cos_id == -1 || cos_id >= 502) - return false; - return cos_id == 501; +RobNode::RobNode() : name(), mat_ptr(), parent(), no_scale_mat() { + } -// 0x1405376C0 -uint32_t get_common_rob_mot(CHARA_NUM cn, int32_t kamae_type, int32_t id) { - if (common_mot_tbl_header - && cn >= 0 && (uint32_t)cn < common_mot_tbl_header->cn_num - && id >= 0 && (uint32_t)id < common_mot_tbl_header->mtp_num) { - CmnMotTblBase* base = (CmnMotTblBase*)((uint8_t*)common_mot_tbl_header - + common_mot_tbl_header->data_tbl); - if (kamae_type >= 0 && kamae_type < base[cn].kamae_max) - return ((uint32_t*)((uint8_t*)common_mot_tbl_header - + *(uint32_t*)((uint8_t*)common_mot_tbl_header - + kamae_type * sizeof(uint32_t) + base[cn].tbl)))[id]; +float_t* RobNode::get_transform_component(size_t index, Expr_type& type) { + switch (index) { + case 0: + type = Expr_variable; + return &transform.pos.x; + case 1: + type = Expr_variable; + return &transform.pos.y; + case 2: + type = Expr_variable; + return &transform.pos.z; + case 3: + type = Expr_variable_rad; + return &transform.rot.x; + case 4: + type = Expr_variable_rad; + return &transform.rot.y; + case 5: + type = Expr_variable_rad; + return &transform.rot.z; + case 6: + type = Expr_variable; + return &transform.scale.x; + case 7: + type = Expr_variable; + return &transform.scale.y; + case 8: + type = Expr_variable; + return &transform.scale.z; + default: + return 0; } - return -1; } -const char* get_dev_ram_opdi_dir() { - return "dev_ram/opdi"; +const float_t* RobNode::get_transform_component(size_t index, Expr_type& type) const { + switch (index) { + case 0: + type = Expr_variable; + return &transform.pos.x; + case 1: + type = Expr_variable; + return &transform.pos.y; + case 2: + type = Expr_variable; + return &transform.pos.z; + case 3: + type = Expr_variable_rad; + return &transform.rot.x; + case 4: + type = Expr_variable_rad; + return &transform.rot.y; + case 5: + type = Expr_variable_rad; + return &transform.rot.z; + case 6: + type = Expr_variable; + return &transform.scale.x; + case 7: + type = Expr_variable; + return &transform.scale.y; + case 8: + type = Expr_variable; + return &transform.scale.z; + default: + return 0; + } } -const float_t get_gravity() { - return 0.00299444468691945f; +void RobNode::init(const char* in_name, mat4* in_mat, mat4* in_no_scale_mat) { + name = in_name; + + mat_ptr = in_mat; + if (in_mat) + *in_mat = mat4_identity; + + parent = 0; + transform.init(); + + no_scale_mat = in_no_scale_mat; + if (in_no_scale_mat) + *in_no_scale_mat = mat4_identity; } -const uint32_t* get_opd_motion_ids() { - static const uint32_t opd_motion_ids[] = { - 195, (uint32_t)-1, // CMN_MRA00_13_01 - }; +bool Fcurve::fcurve_init(const void* data) { + frame_max = 0; + if (!data) + return 0; - return opd_motion_ids; + const mot_data* d = (const mot_data*)data; + frame_max = d->frame_max; + + int32_t fc_max = d->key_set_count; + bool motion_body_type = d->motion_body_type != 0; + this->fc_max = (uint16_t)fc_max; + key_num_type = d->info & 0x8000; + + const mot_key_set_data* key_set = d->key_set_array; + FcurveKey* fck = fck_ptr; + + for (int32_t i = 0; i < fc_max; i++, fck++, key_set++) + fck->kind = (FcurveKeyKind)key_set->type; + + fcurve_init_u16(d->key_set_array); + return motion_body_type; } -const uint32_t* get_opd_motion_set_ids() { - static const uint32_t opd_motion_set_ids[] = { - 51, 194, 797, (uint32_t)-1, // EDT, EDT2, EDTF1 - }; +static uint32_t count_leading_zeros(uint16_t value) { + uint32_t v3 = 16; + if (value >> 8) { + v3 = 8; + value >>= 8; + } - return opd_motion_set_ids; + if (value >> 4) { + v3 -= 4; + value >>= 4; + } + + if (value >> 2) { + v3 -= 2; + value >>= 2; + } + + if (value >> 1) + value = 2; + return v3 - value; } -const char* get_ram_osage_play_data_dir() { - return "ram/osage_play_data"; +void Fcurve::fcurve_init_u16(const void* data) { + const mot_key_set_data* key_set = (const mot_key_set_data*)data; + FcurveKey* fck = fck_ptr; + for (int32_t i = 0; i < fc_max; i++, key_set++, fck++) { + if (fck->kind == FCURVE_KEY_KIND_STATIC_DATA) + fck->val = key_set->values; + else if (fck->kind != FCURVE_KEY_KIND_STATIC_0) { + uint16_t sum = key_set->keys_count; + fck->num = key_set->frames; + fck->val = key_set->values; + + fck->sum = sum; + fck->cache_idx = 0; + + uint16_t last_idx = frame_max; + if (sum > 1) { + if (sum > last_idx) + sum = frame_max; + last_idx = (16 - count_leading_zeros(sum)) * frame_max / sum; + } + fck->last_idx = last_idx; + } + } } -const char* get_ram_osage_play_data_tmp_dir() { - return "ram/osage_play_data_tmp"; -} +void Fcurve::interpolate(float_t frame, float_t* value, + FcurveKey* fck, uint32_t in_fc_max, const struc_369* a6) { + if (a6->field_0 == 4) + frame = prj::floorf(frame); -const char* get_rom_osage_play_data_dir() { - return "rom/osage_play_data"; -} + if (!in_fc_max) + return; -const char* get_rom_osage_play_data_opdi_dir() { - return "rom/osage_play_data/opdi"; -} - -OpdChecker* opd_checker_get() { - return opd_checker; -} - -bool opd_checker_check_state_not_3() { - return opd_checker_get()->CheckStateNot3(); -} - -bool opd_checker_has_objects() { - return !!opd_checker_get()->GetObjects().size(); -} - -void opd_checker_launch_thread() { - opd_checker_get()->LaunchThread(); -} - -void opd_checker_terminate_thread() { - opd_checker_get()->TerminateThread(); -} - -void opd_make_manager_add_task(const OpdMakeManagerArgs& args) { - opd_make_manager->add_task(args); -} - -bool opd_make_manager_check_task_ready() { - return app::TaskWork::check_task_ready(opd_make_manager); -} - -bool opd_make_manager_del_task() { - return opd_make_manager->del_task(); -} - -OpdMakeManagerData* opd_make_manager_get_data() { - return opd_make_manager->GetData(); -} - -void opd_make_start() { - std::vector& objects = opd_checker_get()->GetObjects(); - std::vector motion_ids; - opd_make_start_get_motion_ids(motion_ids); - - OpdMakeManagerArgs args; - args.modules = 0; - args.use_current_skp = false; - args.use_opdi = true; - args.motion_ids = &motion_ids; - args.objects = &objects; - opd_make_manager->add_task(args); -} - -void opd_make_start_get_motion_ids(std::vector& motion_ids) { - data_struct* aft_data = &data_list[DATA_AFT]; - motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - - const uint32_t* opd_motion_set_ids = get_opd_motion_set_ids(); - while (*opd_motion_set_ids != -1) { - const motion_set_info* set_info = aft_mot_db->get_motion_set_by_id(*opd_motion_set_ids); - if (!set_info) { - opd_motion_set_ids++; + for (uint32_t i = in_fc_max; i; i--, fck++, value++) { + FcurveKeyKind kind = fck->kind; + const float_t* val = fck->val; + if (kind == FCURVE_KEY_KIND_STATIC_0) { + *value = 0.0f; + continue; + } + else if (kind == FCURVE_KEY_KIND_STATIC_DATA) { + *value = val[0]; + continue; + } + else if (kind != FCURVE_KEY_KIND_HERMITE && kind != FCURVE_KEY_KIND_HERMITE_TANGENT) { + *value = 0.0f; continue; } - motion_ids.reserve(set_info->motion.size()); - for (const motion_info& i : set_info->motion) - motion_ids.push_back(i.id); - opd_motion_set_ids++; - } + int32_t cache_idx = fck->cache_idx; + int32_t sum = fck->sum; + const uint16_t* num = fck->num; + int32_t frame_int = (int32_t)frame; + size_t key_index; + if (cache_idx > sum + || (frame_int > fck->last_idx + num[cache_idx]) + || cache_idx > 0 && frame_int < num[cache_idx - 1]) { + const uint16_t* key = num; + size_t length = sum; + size_t temp; + while (length > 0) + if (key[temp = length / 2] > frame_int) + length /= 2; + else { + key += temp + 1; + length -= temp + 1; + } + key_index = key - num; + } + else { + const uint16_t* key = &num[cache_idx]; + for (const uint16_t* key_end = &num[sum]; key != key_end; key++) + if (frame_int < *key) + break; + key_index = key - num; + } - /*const uint32_t* opd_motion_ids = get_opd_motion_ids(); - while (*opd_motion_ids != -1) { - motion_ids.push_back(*opd_motion_ids); - opd_motion_ids++; - }*/ - motion_ids.push_back(195); // CMN_MRA00_13_01 - prj::sort_unique(motion_ids); -} + bool found = false; + if (key_index < sum) + for (; key_index < sum; key_index++) + if ((float_t)num[key_index] >= frame) { + found = true; + break; + } -void opd_make_stop() { - opd_checker_terminate_thread(); - opd_make_manager_del_task(); -} + if (found) { + float_t next_frame = (float_t)num[key_index]; + if (fabsf(next_frame - frame) > 0.000001f && key_index > 0) { + float_t curr_frame = (float_t)num[key_index - 1]; + float_t df = frame - curr_frame; + float_t t = df / (next_frame - curr_frame); + if (kind == FCURVE_KEY_KIND_HERMITE) { + val += key_index - 1; + float_t p1 = val[0]; + float_t p2 = val[1]; + *value = (t * 2.0f - 3.0f) * (t * t) * (p1 - p2) + p1; + } + else { + val += key_index * 2 - 2; + float_t p1 = val[0]; + float_t p2 = val[2]; + float_t t1 = val[1]; + float_t t2 = val[3]; + float_t t_1 = t - 1.0f; + *value = (t_1 * t1 + t * t2) * t_1 * df + + (t * 2.0f - 3.0f) * (t * t) * (p1 - p2) + p1; + } + fck->cache_idx = (int32_t)key_index; + continue; + } + } -bool osage_play_data_manager_add_task() { - return osage_play_data_manager->add(); -} - -void osage_play_data_manager_append_chara_motion_id(rob_chara* rob_chr, uint32_t motion_id) { - std::vector motion_ids; - motion_ids.push_back(motion_id); - osage_play_data_manager->AppendCharaMotionId(rob_chr, motion_ids); -} - -void osage_play_data_manager_append_chara_motion_ids( - rob_chara* rob_chr, const std::vector& motion_ids) { - osage_play_data_manager->AppendCharaMotionId(rob_chr, motion_ids); -} - -bool osage_play_data_manager_check_task_ready() { - return osage_play_data_manager->CheckTaskReady(); -} - -void osage_play_data_manager_get_opd_file_data(object_info obj_info, - uint32_t motion_id, const float_t*& data, uint32_t& count) { - osage_play_data_manager->GetOpdFileData(obj_info, motion_id, data, count); -} - -void osage_play_data_manager_reset() { - osage_play_data_manager->Reset(); -} - -void osage_play_database_load() { - data_struct* aft_data = &data_list[DATA_AFT]; - - for (const std::string& i : mdata_manager_get()->GetPrefixes()) { - std::string path(get_rom_osage_play_data_dir()); - path.append("/"); - path.append(i); - path.append("opd_db.txt"); - - if (aft_data->check_file_exists(path.c_str())) - osage_play_data_database->load(path.c_str()); + if (key_index > 0) + key_index--; + if (kind == FCURVE_KEY_KIND_HERMITE) + *value = val[key_index]; + else + *value = val[2 * key_index]; + fck->cache_idx = (int32_t)key_index; } } -void pv_osage_manager_array_reset(int32_t chara_id) { - pv_osage_manager_array_get(chara_id)->Reset(); +void Fcurve::set_fck_ptr(FcurveKey* ptr) { + fck_ptr = ptr; } -void rob_init() { - if (!opd_chara_data_array) - opd_chara_data_array = new opd_chara_data[ROB_ID_MAX]; - - if (!opd_checker) - opd_checker = new OpdChecker; - - if (!opd_make_manager) - opd_make_manager = new OpdMakeManager; - - if (!opd_maker_array) - opd_maker_array = new OpdMaker[OPD_MAKE_COUNT]; - - if (!osage_play_data_database) - osage_play_data_database = new osage_play_data_database_struct; - - if (!osage_play_data_manager) - osage_play_data_manager = new OsagePlayDataManager; - - if (!pv_osage_manager_array) - pv_osage_manager_array = new PvOsageManager[ROB_ID_MAX]; - - if (!rob_chara_age_age_array) - rob_chara_age_age_array = new rob_chara_age_age[ROB_ID_MAX * 3]; - - if (!rob_chara_array) - rob_chara_array = new rob_chara[ROB_ID_MAX]; - - if (!rob_chara_pv_data_array) - rob_chara_pv_data_array = new rob_chara_pv_data[ROB_ID_MAX]; - - { - p_file_handler rob_mot_tbl_file_handler; - rob_mot_tbl_file_handler.read_file(&data_list[DATA_AFT], "rom/rob/", "rob_mot_tbl.bin", prj::MemCSystem); - rob_mot_tbl_file_handler.set_callback_data(0, (PFNFILEHANDLERCALLBACK*)rob_cmn_mottbl_read, 0); - rob_mot_tbl_file_handler.read_now(); - rob_mot_tbl_file_handler.reset(); - } - - if (!rob_sleeve_handler_data) - rob_sleeve_handler_data = new rob_sleeve_handler; - - if (!rob_thread_handler) - rob_thread_handler = new RobThreadHandler; - - if (!task_rob_load) - task_rob_load = new TaskRobLoad; - - if (!task_rob_manager) - task_rob_manager = new TaskRobManager; +mot_key_data::mot_key_data() : key_sets_ready(), key_set_count(), key_set(), +mot(), fc_value(), mot_data(), kind(), motion_body_type(), field_68() { + motnum = -1; + frame = -1.0f; } -void rob_free() { - if (task_rob_manager) { - delete task_rob_manager; - task_rob_manager = 0; +mot_key_data::~mot_key_data() { + +} + +void mot_key_data::interpolate(float_t frame, uint32_t key_set_offset, uint32_t key_set_count) { + mot.interpolate(frame, &fc_value.data()[key_set_offset], + &key_set.data()[key_set_offset], key_set_count, &field_68); +} + +void mot_key_data::reset() { + key_sets_ready = 0; + kind = BONE_KIND_NONE; + frame = -1.0f; + key_set_count = 0; + mot_data = 0; + motion_body_type = 0; + field_68 = {}; + + key_set.clear(); + fc_value.clear(); + motnum = -1; +} + +RobBlock::RobBlock() : ik_type(), inherit_type(), block_id(), flip_block_id(), +inherit_mat_id(), expression_id(), key_set_offset(), key_set_count(), frame(), +up_vector_mat_ptr(), inherit_mat_ptr(), node(), len(), arm_length() { + eyes_xrot_adjust_neg = 1.0f; + eyes_xrot_adjust_pos = 1.0f; +} + +RobBlock::~RobBlock() { + +} + +// 0x1401E9D60 +bool RobBlock::calc_constraint(const RobBlock* block_top) { + vec3 target; + + switch (block_id) { + case BLK_N_SKATA_L_WJ_CD_EX: + mat4_get_translation(block_top[BLK_C_KATA_L].node[2].mat_ptr, &target); + exp_set_dir(target); + break; + case BLK_N_SKATA_R_WJ_CD_EX: + mat4_get_translation(block_top[BLK_C_KATA_R].node[2].mat_ptr, &target); + exp_set_dir(target); + break; + case BLK_N_SKATA_B_L_WJ_CD_CU_EX: + mat4_get_translation(block_top[BLK_N_UP_KATA_L_EX].node[0].mat_ptr, &target); + exp_set_rot(target, 0.333f); + break; + case BLK_N_SKATA_B_R_WJ_CD_CU_EX: + mat4_get_translation(block_top[BLK_N_UP_KATA_R_EX].node[0].mat_ptr, &target); + exp_set_rot(target, 0.333f); + break; + case BLK_N_SKATA_C_L_WJ_CD_CU_EX: + mat4_get_translation(block_top[BLK_N_UP_KATA_L_EX].node[0].mat_ptr, &target); + exp_set_rot(target, 0.5f); + break; + case BLK_N_SKATA_C_R_WJ_CD_CU_EX: + mat4_get_translation(block_top[BLK_N_UP_KATA_R_EX].node[0].mat_ptr, &target); + exp_set_rot(target, 0.5f); + break; + case BLK_N_MOMO_A_L_WJ_CD_EX: + mat4_get_translation(block_top[BLK_CL_MOMO_L].node[2].mat_ptr, &target); + mat4_inverse_transform_point(node[0].mat_ptr, &target, &target); + exp_set_dir_zx(-target); + break; + case BLK_N_MOMO_A_R_WJ_CD_EX: + mat4_get_translation(block_top[BLK_CL_MOMO_R].node[2].mat_ptr, &target); + mat4_inverse_transform_point(node[0].mat_ptr, &target, &target); + exp_set_dir_zx(-target); + break; + case BLK_N_HARA_CD_EX: + mat4_get_translation(block_top[BLK_KL_MUNE_B_WJ].node[0].mat_ptr, &target); + mat4_inverse_transform_point(node[0].mat_ptr, &target, &target); + exp_set_dir_zx(target); + break; + default: + return false; + } + return true; +} + +void RobBlock::copy_rot_trans(const RobBlock& other) { + if (check_expression_id_not_null()) + return; + + switch (ik_type) { + case IKT_0N: + case IKT_0T: + case IKT_ROOT: + leaf_pos[1] = other.leaf_pos[1]; + smooth_pos[0] = other.smooth_pos[0]; + break; } - if (task_rob_load) { - delete task_rob_load; - task_rob_load = 0; - } - - if (rob_thread_handler) { - delete rob_thread_handler; - rob_thread_handler = 0; - } - - if (rob_sleeve_handler_data) { - delete rob_sleeve_handler_data; - rob_sleeve_handler_data = 0; - } - - free_def(common_mot_tbl_header); - - if (rob_chara_pv_data_array) { - delete[] rob_chara_pv_data_array; - rob_chara_pv_data_array = 0; - } - - if (rob_chara_array) { - delete[] rob_chara_array; - rob_chara_array = 0; - } - - if (rob_chara_age_age_array) { - delete[] rob_chara_age_age_array; - rob_chara_age_age_array = 0; - } - - if (pv_osage_manager_array) { - delete[] pv_osage_manager_array; - pv_osage_manager_array = 0; - } - - if (osage_play_data_manager) { - delete osage_play_data_manager; - osage_play_data_manager = 0; - } - - if (osage_play_data_database) { - delete osage_play_data_database; - osage_play_data_database = 0; - } - - if (opd_maker_array) { - delete[] opd_maker_array; - opd_maker_array = 0; - } - - if (opd_make_manager) { - delete opd_make_manager; - opd_make_manager = 0; - } - - if (opd_checker) { - delete opd_checker; - opd_checker = 0; - } - - if (opd_chara_data_array) { - delete[] opd_chara_data_array; - opd_chara_data_array = 0; + switch (ik_type) { + case IKT_0: + case IKT_0N: + case IKT_0T: + case IKT_ROOT: + chain_rot[0] = other.chain_rot[0]; + smooth_rot[0][0] = other.smooth_rot[0][0]; + break; + case IKT_1: + chain_rot[0] = other.chain_rot[0]; + chain_rot[1] = other.chain_rot[1]; + smooth_rot[0][0] = other.smooth_rot[0][0]; + smooth_rot[1][0] = other.smooth_rot[1][0]; + break; + case IKT_2: + case IKT_2R: + chain_rot[0] = other.chain_rot[0]; + chain_rot[1] = other.chain_rot[1]; + chain_rot[2] = other.chain_rot[2]; + smooth_rot[0][0] = other.smooth_rot[0][0]; + smooth_rot[1][0] = other.smooth_rot[1][0]; + smooth_rot[2][0] = other.smooth_rot[2][0]; + break; } } -static void rob_chara_item_equip_object_ctrl_step(rob_chara_item_equip_object* skin_disp, bool disable_ex_force) { +bool RobBlock::check_expression_id_not_null() { + return !!expression_id; +} + +void RobBlock::exp_set_dir(const vec3& target) { + vec3 vx; + mat4_inverse_transform_point(node[0].mat_ptr, &target, &vx); + + float_t len; + len = vec3::length_squared(vx); + if (len <= 0.000001f) + return; + + len = sqrtf(len); + if (len != 0.0f) + vx *= 1.0f / len; + + // Gram-Schmidt process, but hacky + vec3 vz; + vz.x = vx.y * 0.0f - vx.x * vx.z - vx.z; + vz.y = vx.z * -vx.y - 0.0f * vx.x; + vz.z = vx.x * vx.x - -vx.y * vx.y + vx.x; + + // Written other way + //vec3 vz = vec3::cross(vx, vec3(-vx.y, vx.x, 0.0f)) + vec3(-vx.z, 0.0f, vx.x); + + // Expanded + //vec3 vz = vec3::cross(vx, vec3::cross(vec3(0.0f, 0.0f, 1.0f), vx)) + // + vec3::cross(vx, vec3(0.0f, 1.0f, 0.0f)); + + len = vec3::length_squared(vz); + if (len <= 0.000001f) + return; + + len = sqrtf(len); + if (len != 0.0f) + vz *= 1.0f / len; + + vec3 vy = vec3::cross(vz, vx); + + mat4 chain_rot; + mat4_set_row(&chain_rot, 0, vx.x, vx.y, vx.z, 0.0f); + mat4_set_row(&chain_rot, 1, vy.x, vy.y, vy.z, 0.0f); + mat4_set_row(&chain_rot, 2, vz.x, vz.y, vz.z, 0.0f); + mat4_set_row(&chain_rot, 3, 0.0f, 0.0f, 0.0f, 1.0f); + + mat4_mul(&chain_rot, node[0].mat_ptr, node[0].mat_ptr); +} + +void RobBlock::exp_set_dir_zx(vec3 vy) { + float_t len; + len = vec3::length_squared(vy); + if (len <= 0.000001f) + return; + + len = sqrtf(len); + if (len != 0.0f) + vy *= 1.0f / len; + + // Gram-Schmidt process, but hacky + vec3 vz; + vz.x = -vy.x * vy.z - vy.y * 0.0f; + vz.y = 0.0f * vy.x - vy.z * vy.y - vy.z; + vz.z = vy.y * vy.y - vy.x * -vy.x + vy.y; + + // Written other way + //vec3 vz = vec3::cross(vec3(vy.y, -vy.x, 0.0f), vy) + vec3(0.0f, -vy.z, vy.y); + + // Expanded + //vec3 vz = vec3::cross(vec3::cross(vy, vec3(0.0f, 0.0f, 1.0f)), vy) + // + vec3::cross(vec3(1.0f, 0.0f, 0.0f), vy); + + len = vec3::length_squared(vz); + if (len <= 0.000001f) + return; + + len = sqrtf(len); + if (len != 0.0f) + vz *= 1.0f / len; + + vec3 vx = vec3::cross(vy, vz); + + mat4 chain_rot; + mat4_set_row(&chain_rot, 0, vx.x, vx.y, vx.z, 0.0f); + mat4_set_row(&chain_rot, 1, vy.x, vy.y, vy.z, 0.0f); + mat4_set_row(&chain_rot, 2, vz.x, vz.y, vz.z, 0.0f); + mat4_set_row(&chain_rot, 3, 0.0f, 0.0f, 0.0f, 1.0f); + + mat4_mul(&chain_rot, node[0].mat_ptr, node[0].mat_ptr); +} + +void RobBlock::exp_set_rot(const vec3& glo, float_t keisuu) { + vec3 local_target; + mat4_inverse_transform_point(node[0].mat_ptr, &glo, &local_target); + local_target.x = 0.0f; + + float_t len = vec2::length(*(vec2*)&local_target.y); + if (fabsf(len) > 0.000001f) { + float_t angle = atan2f((1.0f / len) * local_target.z, (1.0f / len) * local_target.y); + mat4_mul_rotate_x(node[0].mat_ptr, angle * keisuu, node[0].mat_ptr); + } +} + +bool RobBlock::get_ex_rotation(RobTransform& transform, const RobBlock* block_top) { + RobNode* node; + + switch (block_id) { + case BLK_N_EYE_L_WJ_EX: + transform.rot.x = -block_top[BLK_KL_EYE_L].node[0].transform.rot.x; + transform.rot.y = block_top[BLK_KL_EYE_L].node[0].transform.rot.y * (float_t)(-1.0 / 2.0); + break; + case BLK_N_EYE_R_WJ_EX: + transform.rot.x = -block_top[BLK_KL_EYE_R].node[0].transform.rot.x; + transform.rot.y = block_top[BLK_KL_EYE_R].node[0].transform.rot.y * (float_t)(-1.0 / 2.0); + break; + case BLK_N_KUBI_WJ_EX: { + mat4 mat = block_top[BLK_CL_KAO].chain_rot[0]; + mat4_mul(&block_top[BLK_CL_KAO].chain_rot[1], &mat, &mat); + + vec3 rotation; + mat4_get_rotation_zyx(&mat, &rotation); + + float_t rot = rotation.z; + if (rot < (float_t)-M_PI_2) + rot += (float_t)(M_PI * 2.0); + transform.rot.y = (rot - (float_t)M_PI_2) * 0.2f; + } break; + case BLK_N_HITO_L_EX: + case BLK_N_HITO_R_EX: + transform.rot.z = (float_t)(-9.0 * DEG_TO_RAD); + break; + case BLK_N_KO_L_EX: + transform.rot.x = (float_t)(-8.0 * DEG_TO_RAD); + transform.rot.z = (float_t)(16.0 * DEG_TO_RAD); + break; + case BLK_N_KUSU_L_EX: + case BLK_N_KUSU_R_EX: + transform.rot.z = (float_t)(9.0 * DEG_TO_RAD); + break; + case BLK_N_NAKA_L_EX: + case BLK_N_NAKA_R_EX: + transform.rot.z = (float_t)(-1.0 * DEG_TO_RAD); + break; + case BLK_N_OYA_L_EX: + transform.rot.x = (float_t)(75.0 * DEG_TO_RAD); + transform.rot.y = (float_t)(12.0 * DEG_TO_RAD); + transform.rot.z = (float_t)(-24.0 * DEG_TO_RAD); + break; + case BLK_N_STE_L_WJ_EX: + transform.rot.x = block_top[BLK_KL_TE_L_WJ].node[0].transform.rot.x; + break; + case BLK_N_SUDE_L_WJ_EX: + case BLK_N_SUDE_B_L_WJ_EX: + node = &block_top[BLK_KL_TE_L_WJ].node[0]; + transform.rot.x = RobBlock::limit_angle(node->transform.rot.x) * (float_t)(1.0 / 3.0); + break; + case BLK_N_SUDE_R_WJ_EX: + case BLK_N_SUDE_B_R_WJ_EX: + node = &block_top[BLK_KL_TE_R_WJ].node[0]; + transform.rot.x = RobBlock::limit_angle(node->transform.rot.x) * (float_t)(1.0 / 3.0); + break; + case BLK_N_HIJI_L_WJ_EX: + transform.rot.z = block_top[BLK_C_KATA_L].node[2].transform.rot.z * (float_t)(1.0 / 2.0); + break; + case BLK_N_UP_KATA_L_EX: + case BLK_N_UP_KATA_R_EX: + break; + case BLK_N_KO_R_EX: + transform.rot.x = (float_t)(8.0 * DEG_TO_RAD); + transform.rot.z = (float_t)(16.0 * DEG_TO_RAD); + break; + case BLK_N_OYA_R_EX: + transform.rot.x = (float_t)(-75.0 * DEG_TO_RAD); + transform.rot.y = (float_t)(-12.0 * DEG_TO_RAD); + transform.rot.z = (float_t)(-24.0 * DEG_TO_RAD); + break; + case BLK_N_STE_R_WJ_EX: + transform.rot.x = block_top[BLK_KL_TE_R_WJ].node[0].transform.rot.x; + break; + case BLK_N_HIJI_R_WJ_EX: + transform.rot.z = block_top[BLK_C_KATA_R].node[2].transform.rot.z * (float_t)(1.0 / 2.0); + break; + case BLK_N_HIZA_L_WJ_EX: + transform.rot.z = block_top[BLK_CL_MOMO_L].node[2].transform.rot.z * (float_t)(1.0 / 2.0); + break; + case BLK_N_HIZA_R_WJ_EX: + transform.rot.z = block_top[BLK_CL_MOMO_R].node[2].transform.rot.z * (float_t)(1.0 / 2.0); + break; + case BLK_N_MOMO_B_L_WJ_EX: + case BLK_N_MOMO_C_L_WJ_EX: + node = &block_top[BLK_CL_MOMO_L].node[0]; + transform.rot.y = RobBlock::limit_angle(node->transform.rot.y + + node->transform.rot.x) * (float_t)(1.0 / 3.0); + break; + case BLK_N_MOMO_B_R_WJ_EX: + case BLK_N_MOMO_C_R_WJ_EX: + node = &block_top[BLK_CL_MOMO_R].node[0]; + transform.rot.y = RobBlock::limit_angle(node->transform.rot.y + + node->transform.rot.x) * (float_t)(1.0 / 3.0); + break; + case BLK_N_HARA_B_WJ_EX: + transform.rot.y = block_top[BLK_CL_MUNE].node[0].transform.rot.y * (float_t)(1.0 / 3.0) + + block_top[BLK_KL_KOSI_Y].node[0].transform.rot.y * (float_t)(2.0 / 3.0); + break; + case BLK_N_HARA_C_WJ_EX: + transform.rot.y = block_top[BLK_CL_MUNE].node[0].transform.rot.y * (float_t)(2.0 / 3.0) + + block_top[BLK_KL_KOSI_Y].node[0].transform.rot.y * (float_t)(1.0 / 3.0); + break; + default: + return false; + } + return true; +} + +void RobBlock::get_mat(int32_t target) { + if (check_expression_id_not_null()) + return; + + mat4 mat = inherit_type ? *inherit_mat_ptr : mat4_identity; + + if (ik_type == IKT_0T) { + mat4_mul_translate(&mat, &leaf_pos[1], &mat); + chain_rot[0] = mat4_identity; + } + else if (ik_type == IKT_0N) { + mat4_inverse_transform_point(&mat, &leaf_pos[1], &leaf_pos[1]); + mat4_mul_translate(&mat, &leaf_pos[1], &mat); + chain_rot[0] = mat4_identity; + } + else { + if (block_id == BLK_KL_EYE_L || block_id == BLK_KL_EYE_R) { + if (chain_ang.x > 0.0f) + chain_ang.x *= eyes_xrot_adjust_pos; + else if (chain_ang.x < 0.0f) + chain_ang.x *= eyes_xrot_adjust_neg; + } + + mat4 chain_rot; + if (ik_type == IKT_ROOT) + mat4_mul_rotate_zyx(&this->chain_rot[0], &chain_ang, &chain_rot); + else { + leaf_pos[1] = chain_pos[target]; + mat4_rotate_zyx(&chain_ang, &chain_rot); + } + + mat4_mul_translate(&mat, &leaf_pos[1], &mat); + mat4_mul(&chain_rot, &mat, &mat); + this->chain_rot[0] = chain_rot; + } + + *node[0].mat_ptr = mat; + + solve_ik(target); +} + +void RobBlock::solve_ik(int32_t target) { + if (ik_type < IKT_1) + return; + + mat4 mat = *node[0].mat_ptr; + + vec3 local_target; + mat4_inverse_transform_point(&mat, &leaf_pos[0], &local_target); + + float_t target_len_xy_sq = vec2::length_squared(*(vec2*)&local_target); + float_t target_len_sq = vec3::length_squared(local_target); + float_t target_len_xy = sqrtf(target_len_xy_sq); + float_t target_len = sqrtf(target_len_sq); + mat4 chain_rot; + if (fabsf(target_len_xy) > 0.000001f && fabsf(target_len_sq) > 0.000001f) { + mat4_rotate_z((1.0f / target_len_xy) * local_target.y, + (1.0f / target_len_xy) * local_target.x, &chain_rot); + mat4_mul_rotate_y(&chain_rot, -(1.0f / target_len) * local_target.z, + (1.0f / target_len) * target_len_xy, &chain_rot); + mat4_mul(&chain_rot, &mat, &mat); + } + else + chain_rot = mat4_identity; + + if (up_vector_mat_ptr) { + vec3 up_vector; + mat4_get_translation(up_vector_mat_ptr, &up_vector); + mat4_inverse_transform_point(&mat, &up_vector, &up_vector); + float_t up_vector_length = vec2::length(*(vec2*)&up_vector.y); + if (up_vector_length > 0.000001f) { + up_vector *= 1.0f / up_vector_length; + float_t rot_cos = up_vector.y; + float_t rot_sin = up_vector.z; + mat4_mul_rotate_x(&mat, rot_sin, rot_cos, &mat); + mat4_mul_rotate_x(&chain_rot, rot_sin, rot_cos, &chain_rot); + } + } + + if (ik_type == IKT_1) { + this->chain_rot[1] = chain_rot; + *node[1].mat_ptr = mat; + mat4_mul_translate(&mat, len[0][target], 0.0f, 0.0f, &mat); + + *node[2].mat_ptr = mat; + return; + } + + float_t len0 = len[0][target]; + float_t len1 = len[1][target]; + float_t rot_sin; + float_t rot_cos; + float_t rot_2nd_sin; + float_t rot_2nd_cos; + if (target_len_sq > 0.000001f) { + if (arm_length > 0.0001f) { + float_t max_reach = (len0 + len1) * arm_length; + if (target_len > max_reach) { + target_len = max_reach; + target_len_sq = max_reach * max_reach; + } + } + + float_t proj_length = (target_len_sq - len1 * len1) / len0; + rot_cos = (proj_length + len0) / (2.0f * target_len); + rot_2nd_cos = (proj_length - len0) / (2.0f * len1); + + rot_cos = clamp_def(rot_cos, -1.0f, 1.0f); + rot_2nd_cos = clamp_def(rot_2nd_cos, -1.0f, 1.0f); + + rot_sin = sqrtf(1.0f - rot_cos * rot_cos); + rot_2nd_sin = sqrtf(1.0f - rot_2nd_cos * rot_2nd_cos); + if (ik_type == IKT_2R) + rot_sin = -rot_sin; + else + rot_2nd_sin = -rot_2nd_sin; + } + else { + rot_sin = 0.0f; + rot_cos = 1.0f; + rot_2nd_sin = 0.0f; + rot_2nd_cos = -1.0f; + } + + mat4_mul_rotate_z(&mat, rot_sin, rot_cos, &mat); + *node[1].mat_ptr = mat; + mat4_mul_rotate_z(&chain_rot, rot_sin, rot_cos, &chain_rot); + this->chain_rot[1] = chain_rot; + mat4_mul_translate(&mat, len0, 0.0f, 0.0f, &mat); + + mat4_mul_rotate_z(&mat, rot_2nd_sin, rot_2nd_cos, &mat); + *node[2].mat_ptr = mat; + mat4_rotate_z(rot_2nd_sin, rot_2nd_cos, &chain_rot); + this->chain_rot[2] = chain_rot; + mat4_mul_translate(&mat, len1, 0.0f, 0.0f, &mat); + + *node[3].mat_ptr = mat; +} + +// 0x1401EB6D0 +void RobBlock::recalc_fk_block(const mat4& cur_mat, const RobBlock* block_top, bool rot) { + mat4 mat = inherit_type ? *inherit_mat_ptr : cur_mat; + + if (ik_type != IKT_0N && ik_type != IKT_0T) { + if (ik_type != IKT_ROOT) + leaf_pos[1] = chain_pos[1]; + + mat4_mul_translate(&mat, &leaf_pos[1], &mat); + if (rot) { + node[0].transform.rot = 0.0f; + if (!check_expression_id_not_null()) + mat4_get_rotation_zyx(&chain_rot[0], &node[0].transform.rot); + else if (get_ex_rotation(node[0].transform, block_top)) + mat4_rotate_zyx(&node[0].transform.rot, &chain_rot[0]); + else { + *node[0].mat_ptr = mat; + + if (calc_constraint(block_top)) { + mat4 chain_rot; + mat4_invert_rotation_fast(&mat, &chain_rot); + mat4_mul(node[0].mat_ptr, &chain_rot, &chain_rot); + mat4_clear_trans(&chain_rot, &chain_rot); + mat4_get_rotation_zyx(&chain_rot, &node[0].transform.rot); + this->chain_rot[0] = chain_rot; + } + else + chain_rot[0] = mat4_identity; + } + } + + mat4_mul(&chain_rot[0], &mat, &mat); + } + else { + mat4_mul_translate(&mat, &leaf_pos[1], &mat); + if (rot) + node[0].transform.rot = 0.0f; + } + + *node[0].mat_ptr = mat; + + if (rot) { + node[0].transform.pos = leaf_pos[1]; + node[0].transform.reset_scale(); + } + + if (ik_type < IKT_1) + return; + + mat4_mul(&chain_rot[1], &mat, &mat); + *node[1].mat_ptr = mat; + + if (ik_type == IKT_1) { + mat4_mul_translate(&mat, len[0][1], 0.0f, 0.0f, &mat); + *node[2].mat_ptr = mat; + + if (rot) { + node[1].transform.pos = 0.0f; + mat4_get_rotation_zyx(&chain_rot[1], &node[1].transform.rot); + node[1].transform.reset_scale(); + + node[2].transform.init(len[0][1], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + } + } + else { + mat4_mul_translate(&mat, len[0][1], 0.0f, 0.0f, &mat); + mat4_mul(&chain_rot[2], &mat, &mat); + *node[2].mat_ptr = mat; + + mat4_mul_translate(&mat, len[1][1], 0.0f, 0.0f, &mat); + *node[3].mat_ptr = mat; + + if (rot) { + node[1].transform.pos = 0.0f; + mat4_get_rotation_zyx(&chain_rot[1], &node[1].transform.rot); + node[1].transform.reset_scale(); + + node[2].transform.pos = { len[0][1], 0.0f, 0.0f }; + mat4_get_rotation_zyx(&chain_rot[2], &node[2].transform.rot); + node[2].transform.reset_scale(); + + node[3].transform.init(len[1][1], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + } + } +} + +const vec3* RobBlock::set_global_leaf_sub(const vec3* val, BONE_KIND kind, bool get_data, bool flip_x) { + if (ik_type == IKT_ROOT) { + if (get_data) { + leaf_pos[1] = *val; + if (flip_x) + leaf_pos[1].x = -leaf_pos[1].x; + } + val++; + } + else if (ik_type == IKT_1 || ik_type == IKT_2 || ik_type == IKT_2R) { + if (get_data) { + leaf_pos[0] = *val; + if (flip_x) + leaf_pos[0].x = -leaf_pos[0].x; + } + val++; + } + + if (get_data) { + if (ik_type == IKT_0N || ik_type == IKT_0T) { + leaf_pos[1] = *val; + if (flip_x) + leaf_pos[1].x = -leaf_pos[1].x; + } + else if (!expression_id) { + chain_ang = *val; + if (flip_x) { + const skeleton_rotation_offset* rot_off = skeleton_rotation_offset_array; + size_t index = block_id; + if (rot_off[index].x) + chain_ang.x = rot_off[index].rotation.x - chain_ang.x; + if (rot_off[index].y) + chain_ang.y = rot_off[index].rotation.y - chain_ang.y; + if (rot_off[index].z) + chain_ang.z = rot_off[index].rotation.z - chain_ang.z; + } + } + } + val++; + return val; +} + +void RobBlock::get_smooth_target(int32_t target) { + if (check_expression_id_not_null()) + return; + + switch (ik_type) { + case IKT_0N: + case IKT_0T: + case IKT_ROOT: + smooth_pos[target] = leaf_pos[1]; + break; + } + + switch (ik_type) { + case IKT_0: + smooth_rot[0][target] = chain_rot[0]; + break; + case IKT_0N: + case IKT_0T: + case IKT_ROOT: + smooth_rot[0][target] = chain_rot[0]; + break; + case IKT_1: + smooth_rot[0][target] = chain_rot[0]; + smooth_rot[1][target] = chain_rot[1]; + break; + case IKT_2: + case IKT_2R: + smooth_rot[0][target] = chain_rot[0]; + smooth_rot[1][target] = chain_rot[1]; + smooth_rot[2][target] = chain_rot[2]; + break; + } +} + +float_t RobBlock::limit_angle(float_t angle) { + bool neg; + if (angle < 0.0f) { + angle = -angle; + neg = true; + } + else + neg = false; + + angle = fmodf(angle + (float_t)M_PI, (float_t)(M_PI * 2.0)) - (float_t)M_PI; + if (neg) + return -angle; + else + return angle; +} + +static void RobSkinDisp_ctrl_step(RobSkinDisp* skin_disp, bool disable_ex_force) { for (int32_t i = 0; i < 6; i++) for (ExNodeBlock*& j : skin_disp->ex_node_block) j->CtrlStep(i, disable_ex_force); } -static void rob_chara_item_equip_object_load_opd_data(rob_chara_item_equip_object* skin_disp) { +static void RobSkinDisp_load_opd_data(RobSkinDisp* skin_disp) { if (!skin_disp->osage_blk.size() && !skin_disp->cloth.size()) return; #if OPD_PLAY_GEN - rob_chara_item_equip* rob_disp = (rob_chara_item_equip*)skin_disp->rob_disp; + RobDisp* rob_disp = (RobDisp*)skin_disp->rob_disp; size_t index = 0; for (opd_blend_data& i : rob_disp->opd_blend_data) { #else - const rob_chara_item_equip* rob_disp = skin_disp->rob_disp; + const RobDisp* rob_disp = skin_disp->rob_disp; size_t index = 0; for (const opd_blend_data& i : rob_disp->opd_blend_data) { #endif const float_t* opd_data = 0; uint32_t opd_count = 0; - osage_play_data_manager_get_opd_file_data(skin_disp->obj_uid, i.motion_id, opd_data, opd_count); + osage_play_data_manager_get_opd_file_data(skin_disp->obj_uid, i.motnum, opd_data, opd_count); if (!opd_data) break; @@ -2819,8 +3472,8 @@ static void rob_chara_item_equip_object_load_opd_data(rob_chara_item_equip_objec } } -static void rob_chara_item_equip_object_ctrl(rob_chara_item_equip_object* skin_disp) { - if (rob_chara_item_equip_object_disable_node_blocks) +static void RobSkinDisp_ctrl(RobSkinDisp* skin_disp) { + if (rob_skin_disp_disable_node_blocks) return; if (skin_disp->init_cnt > 0) { @@ -2836,13 +3489,13 @@ static void rob_chara_item_equip_object_ctrl(rob_chara_item_equip_object* skin_d if (skin_disp->use_opd) { skin_disp->use_opd = false; - rob_chara_item_equip_object_load_opd_data(skin_disp); + RobSkinDisp_load_opd_data(skin_disp); for (ExNodeBlock*& i : skin_disp->ex_node_block) i->CtrlOsagePlayData(); } else { if (skin_disp->osage_depends_on_others) - rob_chara_item_equip_object_ctrl_step(skin_disp, false); + RobSkinDisp_ctrl_step(skin_disp, false); for (ExNodeBlock*& i : skin_disp->ex_node_block) i->ctrl(); @@ -2852,18 +3505,18 @@ static void rob_chara_item_equip_object_ctrl(rob_chara_item_equip_object* skin_d i->CtrlEnd(); } -static void rob_chara_item_equip_ctrl(rob_chara_item_equip* rob_disp) { - if (!osage_test_no_pause && !rob_disp->disable_update) - for (int32_t i = rob_disp->disp_begin; i < rob_disp->disp_max; i++) - rob_chara_item_equip_object_ctrl(&rob_disp->skin_disp[i]); +static void RobDisp_ctrl(RobDisp* disp) { + if (!osage_test_no_pause && !disp->disable_update) + for (int32_t i = disp->disp_begin; i < disp->disp_max; i++) + RobSkinDisp_ctrl(&disp->skin_disp[i]); } static void rob_chara_data_adjust_ctrl(rob_chara* rob_chr, rob_chara_data_adjust* adjust, rob_chara_data_adjust* adjust_prev) { float_t cycle = adjust->cycle; - adjust->frame += rob_chr->data.motion.step_data.frame; - if (rob_chr->data.motdata.field_0.field_58 == 1) - cycle *= (60.0f / rob_chr->data.motdata.field_0.frame); + adjust->frame += rob_chr->rob_base.robmot.step.f; + if (rob_chr->rob_base.motdata.next_type == MH_NEXT_REPEAT) + cycle *= (60.0f / rob_chr->rob_base.motdata.frame); cycle *= adjust->frame * 2.0f * (float_t)M_PI * (float_t)(1.0 / 60.0f); float_t cycle_val = 0.0f; @@ -2882,7 +3535,7 @@ static void rob_chara_data_adjust_ctrl(rob_chara* rob_chr, switch (adjust->type) { case 1: { mat4 mat = mat4_identity; - mat4_mul_rotate_y(&mat, rob_chr->data.position.yang.get_rad(), &mat); + mat4_mul_rotate_y(&mat, rob_chr->rob_base.position.yang.get_rad(), &mat); mat4_transform_vector(&mat, &adjust->curr_ex_force, &adjust->curr_ex_force); } case 2: { @@ -2933,11 +3586,11 @@ static void rob_chara_data_adjust_ctrl(rob_chara* rob_chr, else if (!transition_frame_step) return; - adjust->transition_frame += rob_chr->data.motion.step_data.frame; + adjust->transition_frame += rob_chr->rob_base.robmot.step.f; } -static void rob_chara_item_equip_object_set_parts_ex_force( - rob_chara_item_equip_object* skin_disp, const rob_osage_parts_bit& parts_bits, +static void RobSkinDisp_set_parts_ex_force( + RobSkinDisp* skin_disp, const rob_osage_parts_bit& parts_bits, const vec3* ex_force, const float_t& force, const float_t& gain) { for (ExOsageBlock*& i : skin_disp->osage_blk) if (i->osage_work.CheckPartsBits(parts_bits)) { @@ -2946,7 +3599,7 @@ static void rob_chara_item_equip_object_set_parts_ex_force( } } -static void rob_chara_item_equip_set_parts_ex_force(rob_chara_item_equip* rob_disp, +static void RobDisp_set_parts_ex_force(RobDisp* rob_disp, const rob_osage_parts& parts, const vec3* ex_force, const float_t& force, const float_t& strength) { ROB_PARTS_KIND rpk = (ROB_PARTS_KIND)(parts == ROB_OSAGE_PARTS_MUFFLER ? RPK_OUTER : RPK_KAMI); if (!osage_setting_data_obj_has_key(rob_disp->skin_disp[rpk].obj_uid)) @@ -2984,12 +3637,10 @@ static void rob_chara_item_equip_set_parts_ex_force(rob_chara_item_equip* rob_di if (!rob_disp->parts_white_one_l && parts == ROB_OSAGE_PARTS_LONG_C) enum_or(parts_bits, ROB_OSAGE_PARTS_WHITE_ONE_L_BIT); - rob_chara_item_equip_object_set_parts_ex_force( - &rob_disp->skin_disp[rpk], parts_bits, ex_force, force, strength); + RobSkinDisp_set_parts_ex_force(&rob_disp->skin_disp[rpk], parts_bits, ex_force, force, strength); } -static void rob_chara_item_equip_object_set_ex_force( - rob_chara_item_equip_object* skin_disp, const vec3& f) { +static void RobSkinDisp_set_ex_force(RobSkinDisp* skin_disp, const vec3& f) { for (ExOsageBlock*& i : skin_disp->osage_blk) i->set_ex_force(f); @@ -2997,45 +3648,39 @@ static void rob_chara_item_equip_object_set_ex_force( i->set_ex_force(f); } -static void rob_chara_item_equip_set_ex_force( - rob_chara_item_equip* rob_disp, const vec3& f) { +static void RobDisp_set_ex_force(RobDisp* rob_disp, const vec3& f) { for (int32_t i = rob_disp->disp_begin; i < rob_disp->disp_max; i++) - rob_chara_item_equip_object_set_ex_force(&rob_disp->skin_disp[i], f); + RobSkinDisp_set_ex_force(&rob_disp->skin_disp[i], f); } void rob_chara::adjust_ctrl() { - rob_chara_item_equip* rob_disp = this->rob_disp; + RobDisp* disp = this->disp; for (int32_t i = 0; i < ROB_OSAGE_PARTS_MAX; i++) { - rob_chara_data_adjust* parts_adjust = &data.motion.parts_adjust[i]; + rob_chara_data_adjust* parts_adjust = &rob_base.robmot.parts_adjust[i]; if (parts_adjust->enable) { - rob_chara_data_adjust_ctrl(this, parts_adjust, &data.motion.parts_adjust_prev[i]); + rob_chara_data_adjust_ctrl(this, parts_adjust, &rob_base.robmot.parts_adjust_prev[i]); rob_osage_parts parts = (rob_osage_parts)i; - rob_chara_item_equip_set_parts_ex_force(rob_disp, parts, + RobDisp_set_parts_ex_force(disp, parts, &parts_adjust->curr_ex_force, parts_adjust->curr_force, parts_adjust->curr_strength); } } - rob_chara_data_adjust* adjust_global = &data.motion.adjust_global; + rob_chara_data_adjust* adjust_global = &rob_base.robmot.adjust_global; if (adjust_global->enable) { - rob_chara_data_adjust_ctrl(this, adjust_global, &data.motion.adjust_global_prev); - rob_chara_item_equip_set_ex_force(rob_disp, adjust_global->curr_ex_force); + rob_chara_data_adjust_ctrl(this, adjust_global, &rob_base.robmot.adjust_global_prev); + RobDisp_set_ex_force(disp, adjust_global->curr_ex_force); } - rob_disp->parts_short = false; - rob_disp->parts_append = false; - rob_disp->parts_white_one_l = false; + disp->parts_short = false; + disp->parts_append = false; + disp->parts_white_one_l = false; } -static BONE_BLK rob_motion_c_kata_bone_get(int32_t index) { - switch (index) { - case 0: - return BLK_C_KATA_L; - case 1: - return BLK_C_KATA_R; - default: - return BLK_DUMMY; - } +static BONE_BLK get_lc_arm_block(int32_t index) { + if (index >= 0 && index < 2) + return lc_arm_block_tbl[index]; + return BLK_DUMMY; } static void rob_chara_bone_data_set_motion_arm_length(rob_chara_bone_data* rob_bone_data, @@ -3071,75 +3716,71 @@ static void rob_chara_data_arm_adjust_ctrl(rob_chara* rob_chr, int32_t index, ro else arm_adjust->value = blend + prev_value * inv_blend; } - arm_adjust->frame += rob_chr->data.motion.step_data.frame; + arm_adjust->frame += rob_chr->rob_base.robmot.step.f; rob_chara_bone_data_set_motion_arm_length(rob_chr->bone_data, - rob_motion_c_kata_bone_get(index), arm_adjust->value); + get_lc_arm_block(index), arm_adjust->value); } void rob_chara::arm_adjust_ctrl() { for (int32_t i = 0; i < 2; i++) - rob_chara_data_arm_adjust_ctrl(this, i, &data.motion.arm_adjust[i]); + rob_chara_data_arm_adjust_ctrl(this, i, &rob_base.robmot.arm_adjust[i]); } void rob_chara::autoblink_disable() { - data.motion.field_2A |= 0x02; + rob_base.robmot.flag.u32 |= 0x020000; } void rob_chara::autoblink_enable() { - data.motion.field_2A &= ~0x02; + rob_base.robmot.flag.u32 &= ~0x020000; } mat4* rob_chara::get_bone_data_mat(size_t index) { return rob_chara_bone_data_get_mat(bone_data, index); } +uint32_t rob_chara::get_common_mot(MOTTABLE_TYPE mottbl_type) const { + if (mottbl_type >= MTP_FACE_MOT_SLOT_1 && mottbl_type <= MTP_FACE_MOT_SLOT_10) + return rob_init.face_mot_slot[mottbl_type - MTP_FACE_MOT_SLOT_1]; + else if (mottbl_type == MTP_EYES_BASE_MOT) + return rob_base.robmot.num; + else if (mottbl_type >= MTP_226 && mottbl_type <= MTP_235) + return rob_init.face_mot_slot[mottbl_type - MTP_226]; + return get_common_rob_mot(chara_num, rob_base.action.kamae_type, mottbl_type); +} + +const vec3* rob_chara::get_gpos() const { + return &rob_base.position.gpos; +} + +float_t rob_chara::get_frame() const { + return bone_data->get_frame(); +} + +float_t rob_chara::get_frame_max() const { + return bone_data->get_frame_max(); +} + object_info rob_chara::get_rob_data_face_object(int32_t index) { if (index >= 0 && index < 15) return rob_data->face_objects[index]; return {}; } -float_t rob_chara::get_frame() { - return bone_data->get_frame(); +float_t rob_chara::get_face_depth() const { + return item.get_face_depth(); } -float_t rob_chara::get_frame_count() { - return bone_data->get_frame_count(); -} - -float_t rob_chara::get_max_face_depth() { - return item_cos_data.get_max_face_depth(); -} - -uint32_t rob_chara::get_rob_cmn_mottbl_motion_id(int32_t id) { - if (id >= 214 && id <= 223) - return pv_data.motion_face_ids[id - 214]; - else if (id == 224) - return data.motion.motion_id; - else if (id >= 226 && id <= 235) - return pv_data.motion_face_ids[id - 226]; - return get_common_rob_mot(chara_num, data.action.kamae_type, id); -} - -float_t rob_chara::get_pos_scale(int32_t bone, vec3& pos) { - if (bone < 0 || bone > 26) +float_t rob_chara::get_pos_scale(ROB_COLLI_ID colli_id, vec3& center) { + if (colli_id < 0 || colli_id >= ROB_COLLI_ID_MAX) return 0.0f; - pos = data.field_1E68.field_DF8[bone].pos; - return data.field_1E68.field_DF8[bone].scale; + + center = rob_base.collision.cb_hit[colli_id].ball.c; + return rob_base.collision.cb_hit[colli_id].ball.r; } -static int16_t sub_14054FE90(rob_chara* rob_chr, bool a3) { - int16_t v3 = rob_chr->data.position.yang.value; - if (!a3 || !rob_chr->data.flag.bit.compel) { - int16_t v4 = rob_chr->data.action.field_B8.field_8; - if (v4) - return v3 + v4; - } - - if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x100) - return v3 + rob_chr->data.motdata.field_0.field_274; - return v3; +const RobInit* rob_chara::get_rob_init() const { + return &rob_init; } static void sub_14041B9D0(rob_chara_bone_data* rob_bone_data) { @@ -3151,46 +3792,46 @@ static void sub_14041B9D0(rob_chara_bone_data* rob_bone_data) { sleeve_adjust.field_74 = 0.0f; sleeve_adjust.field_80 = 0.0f; sleeve_adjust.radius = 1.0f; - sleeve_adjust.bones = 0; + sleeve_adjust.block_vec = 0; sleeve_adjust.step = 1.0f; } static void sub_14041D6F0(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v3 = &rob_bone_data->motion_loaded.front()->field_4F8; - v3->field_BD = v3->field_BC; - v3->field_BC = a2; + MotionSmooth* v3 = &rob_bone_data->motion_loaded.front()->smooth; + v3->root_xzpos = v3->root_ypos; + v3->root_ypos = a2; } static void sub_14041D720(rob_chara_bone_data* a1, bool a2) { - a1->motion_loaded.front()->field_4F8.field_BD = a2; + a1->motion_loaded.front()->smooth.root_xzpos = a2; } static float_t sub_14054FDE0(rob_chara* rob_chr) { - if (rob_chr->data.motdata.field_0.field_2C0 >= 0.0f) - return rob_chr->data.motdata.field_0.field_2C0; - else if (rob_chr->data.flag.bit.ringout) + if (rob_chr->rob_base.motdata.smooth_f_length >= 0.0f) + return rob_chr->rob_base.motdata.smooth_f_length; + else if (rob_chr->rob_base.flag.bit.ringout) return 10.0; - else if ((rob_chr->data.motdata.field_0.field_10.field_0 & 0x4000) - || (rob_chr->data.motdata.field_0.field_20.field_8 & 0x08)) + else if ((rob_chr->rob_base.motdata.motkind_fix[MK_ATTACK]) + || (rob_chr->rob_base.motdata.motkind[MK_SYAGAMI_DASH])) return 5.0f; - else if (rob_chr->data.motion.motion_id == rob_chr->data.motion.prev_motion_id) + else if (rob_chr->rob_base.robmot.num == rob_chr->rob_base.robmot.old_num) return 4.0f; - else if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x200) { - if (rob_chr->data.flag.bit.old_fix_hara || rob_chr->data.flag.bit.land) + else if (rob_chr->rob_base.motdata.motkind[MK_YARARE]) { + if (rob_chr->rob_base.flag.bit.old_fix_hara || rob_chr->rob_base.flag.bit.land) return 1.0f; } else { - if (!(rob_chr->data.motdata.field_0.field_20.field_0 & 0x8000) - || !(rob_chr->data.motdata.field_0.field_20.field_0 & 0x01)) + if (!rob_chr->rob_base.motdata.motkind[MK_GUARD] + || !rob_chr->rob_base.motdata.motkind[MK_CHANGE]) return 7.0f; } return 3.0f; } static float_t sub_14054FEE0(rob_chara* a1) { - if (a1->data.motdata.field_0.field_2C4 >= 0.0f) - return a1->data.motdata.field_0.field_2C4; - else if (a1->data.motdata.field_0.field_20.field_0 & 0x200) + if (a1->rob_base.motdata.smooth_r_length >= 0.0f) + return a1->rob_base.motdata.smooth_r_length; + else if (a1->rob_base.motdata.motkind[MK_YARARE]) return 14.0f; else return 7.0f; @@ -3203,7 +3844,7 @@ static void sub_14041D310(rob_chara_bone_data* rob_bone_data, float_t a2, float_ } static void sub_14041C9D0(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + MotionSmooth* v2 = &rob_bone_data->motion_loaded.front()->smooth; v2->field_8 = (uint8_t)(v2->field_0 & 1); if (a2) v2->field_0 |= 0x01; @@ -3212,7 +3853,7 @@ static void sub_14041C9D0(rob_chara_bone_data* rob_bone_data, bool a2) { } static void sub_14041C680(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + MotionSmooth* v2 = &rob_bone_data->motion_loaded.front()->smooth; if (a2) v2->field_0 |= 0x02; else @@ -3220,7 +3861,7 @@ static void sub_14041C680(rob_chara_bone_data* rob_bone_data, bool a2) { } static void sub_14041D2D0(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + MotionSmooth* v2 = &rob_bone_data->motion_loaded.front()->smooth; if (a2) v2->field_0 |= 0x04; else @@ -3228,7 +3869,7 @@ static void sub_14041D2D0(rob_chara_bone_data* rob_bone_data, bool a2) { } static void sub_14041BC40(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + MotionSmooth* v2 = &rob_bone_data->motion_loaded.front()->smooth; if (a2) v2->field_0 |= 0x08; else @@ -3236,7 +3877,7 @@ static void sub_14041BC40(rob_chara_bone_data* rob_bone_data, bool a2) { } static void sub_14041D6C0(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + MotionSmooth* v2 = &rob_bone_data->motion_loaded.front()->smooth; if (a2) v2->field_0 |= 0x10; else @@ -3244,45 +3885,45 @@ static void sub_14041D6C0(rob_chara_bone_data* rob_bone_data, bool a2) { } static void sub_14041D340(rob_chara_bone_data* rob_bone_data, bool a2) { - struc_308* v2 = &rob_bone_data->motion_loaded.front()->field_4F8; + MotionSmooth* v2 = &rob_bone_data->motion_loaded.front()->smooth; if (a2) v2->field_0 |= 0x20; else v2->field_0 &= ~0x20; } -static void sub_140414F00(struc_308* a1, float_t rot_y) { - a1->prev_rot_y = a1->rot_y; - a1->rot_y = rot_y; +static void sub_140414F00(MotionSmooth* a1, float_t value) { + a1->move_yang_bef = a1->move_yang; + a1->move_yang = value; } -static void sub_14041D270(rob_chara_bone_data* rob_bone_data, float_t rot_y) { - sub_140414F00(&rob_bone_data->motion_loaded.front()->field_4F8, rot_y); +static void sub_14041D270(rob_chara_bone_data* rob_bone_data, float_t value) { + sub_140414F00(&rob_bone_data->motion_loaded.front()->smooth, value); } -static void sub_14041D2A0(rob_chara_bone_data* rob_bone_data, float_t rot_y) { - rob_bone_data->motion_loaded.front()->field_4F8.prev_rot_y = rot_y; +static void sub_14041D2A0(rob_chara_bone_data* rob_bone_data, float_t value) { + rob_bone_data->motion_loaded.front()->smooth.move_yang_bef = value; } static void sub_140555B00(rob_chara* rob_chr, bool a2) { bool v3; if (!a2) v3 = 0; - else if (rob_chr->data.motion.prev_motion_id == -1) + else if (rob_chr->rob_base.robmot.old_num == -1) v3 = 0; else { - v3 = !(rob_chr->data.motdata.field_0.field_20.field_0 & 0x400) - || !(rob_chr->data.motdata.field_0.field_10.field_0 & 0x40) - || rob_chr->data.motdata.field_0.field_20.field_0 & 0x100000; + v3 = !rob_chr->rob_base.motdata.motkind[MK_YARARE] + || !rob_chr->rob_base.motdata.motkind_fix[MK_AIR] + || rob_chr->rob_base.motdata.motkind[MK_NAGERARE]; } bool v6; int32_t v7; - if (rob_chr->data.motdata.field_0.field_52) { + if (rob_chr->rob_base.motdata.end_style) { v6 = 0; v7 = 2; } - else if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x8000) { + else if (rob_chr->rob_base.motdata.motkind[MK_GUARD]) { v6 = 0; v7 = 2; } @@ -3291,12 +3932,12 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { v7 = 1; } - if (rob_chr->data.motdata.field_0.field_52 != 3 && rob_chr->data.action.kamae_type) { + if (rob_chr->rob_base.motdata.end_style != 3 && rob_chr->rob_base.action.kamae_type) { v6 = 0; v7 = 2; } - float_t v8 = rob_chr->data.motion.frame_data.frame; + float_t v8 = rob_chr->rob_base.robmot.frame.f; float_t v9 = 0.0f; float_t v10 = 0.0f; if (v3) @@ -3306,10 +3947,10 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { if (v6) v9 = sub_14054FEE0(rob_chr); - float_t v12 = rob_chr->data.motdata.field_0.frame; + float_t v12 = rob_chr->rob_base.motdata.frame; float_t v13 = v12 - v9; if (v3 && v6 && (v13 < v11 || v13 <= v8)) { - float_t v14 = rob_chr->data.motdata.field_0.frame; + float_t v14 = rob_chr->rob_base.motdata.frame; float_t v16 = prj::floorf((v12 - v8) * 0.5f) + v8; if (v11 > v16) { float_t v17; @@ -3319,7 +3960,7 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { v9 = v12 - v16; } else - v17 = rob_chr->data.motdata.field_0.frame - v9; + v17 = rob_chr->rob_base.motdata.frame - v9; v10 = v17 - v8; } else { @@ -3327,245 +3968,112 @@ static void sub_140555B00(rob_chara* rob_chr, bool a2) { v9 = v12 - v11; } } + rob_chr->bone_data->set_motion_blend_duration(v9, 1.0f, 1.0f); sub_14041D310(rob_chr->bone_data, v9, v13, v7); - sub_14041D340(rob_chr->bone_data, !!(rob_chr->data.motdata.field_0.field_54 & 0x40)); - sub_14041D6C0(rob_chr->bone_data, (rob_chr->data.motdata.field_0.field_40.field_0 & 0x10) - && (rob_chr->data.motdata.field_0.field_20.field_0 & 0x08)); - sub_14041D6F0(rob_chr->bone_data, - !!(rob_chr->data.motdata.field_0.field_10.field_8 & 0x18000000)); - sub_14041D720(rob_chr->bone_data, - !!(rob_chr->data.motdata.field_0.field_30.field_8 & 0x18000000)); - sub_14041D2A0(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.motdata.field_0.field_276 * M_PI * (1.0 / 32768.0))); - sub_14041D270(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.motdata.field_0.field_274 * M_PI * (1.0 / 32768.0))); + sub_14041D340(rob_chr->bone_data, rob_chr->rob_base.motdata.end_style_flag & 0x40); + sub_14041D6C0(rob_chr->bone_data, rob_chr->rob_base.motdata.old_motkind[MK_NO_MOVE] + && rob_chr->rob_base.motdata.motkind[MK_NO_TRANS]); + sub_14041D6F0(rob_chr->bone_data, rob_chr->rob_base.motdata.motkind_fix[MK_Y_TRANS] + || rob_chr->rob_base.motdata.motkind_fix[MK_Y_MOVE]); + sub_14041D720(rob_chr->bone_data, rob_chr->rob_base.motdata.old_motkind_fix[MK_Y_TRANS] + || rob_chr->rob_base.motdata.old_motkind_fix[MK_Y_MOVE]); + sub_14041D2A0(rob_chr->bone_data, rob_chr->rob_base.motdata.old_mov_yang.get_rad()); + sub_14041D270(rob_chr->bone_data, rob_chr->rob_base.motdata.mov_yang.get_rad()); } -// 0x140536D30 -static void mothead_apply_mot_inner(mothead_mot_func_data* func_data, int32_t type, const mothead_mot_data* mhd_mot_data) { - mothead_mot_func_array[type](func_data, mhd_mot_data->data, mhd_mot_data); -} +static void sub_14053A9C0(RobMotData* a1, rob_chara* rob_chr, + uint32_t motnum, float_t frame_max, const motion_database* mot_db) { + a1->mot = motnum; + a1->main_mot_frame = 0.0f; + a1->frame_max = frame_max; + a1->follow1_frame = frame_max - 1.0f; + a1->follow2_frame = frame_max - 1.0f; + a1->stop_frame = frame_max - 1.0f; + a1->land_frame = frame_max - 1.0f; -// 0x140537380 -static void mothead_apply_mot(struc_223* a1, rob_chara* rob_chr, const mothead_mot_data* mhd_mot_data) { - if (!mhd_mot_data || !mhd_mot_data->data) - return; - - mothead_mot_func_data func_data; - func_data.rob_chara = rob_chr; - func_data.rob_base = &rob_chr->data; - func_data.field_10 = &rob_chr->data.motdata; - - while (mhd_mot_data->data && mhd_mot_data->type >= 0) { - mothead_apply_mot_inner(&func_data, mhd_mot_data->type, mhd_mot_data); - mhd_mot_data++; - } -} - -static void sub_14053A9C0(struc_223* a1, rob_chara* rob_chr, - uint32_t motion_id, float_t frame_count, const motion_database* mot_db) { - a1->field_0.motion_id = motion_id; - a1->field_0.field_78 = 0.0f; - a1->field_0.frame_count = frame_count; - a1->field_0.field_7C = frame_count - 1.0f; - a1->field_0.field_80 = frame_count - 1.0f; - a1->field_0.field_1F0 = frame_count - 1.0f; - a1->field_0.field_1F4 = frame_count - 1.0f; - - const mothead_mot* mot = mothead_storage_get_mot_by_motion_id(motion_id, mot_db); + const MhdData* mot = mothead_storage_get_mot_by_motion_id(motnum, mot_db); if (!mot) return; - a1->field_330.field_0.current = mot->data; - a1->field_330.field_0.data = mot->data; - a1->field_7A0 = mot->field_28; - a1->motion_set_id = mot_db->get_motion_set_id_by_motion_id(motion_id); - a1->field_0.field_10 = mot->field_0; - a1->field_0.field_20 = mot->field_0; - a1->field_0.field_20.field_0 &= ~0x4000; - if (a1->field_0.field_10.field_0 & 0x100) - a1->field_0.field_274 = (int16_t)0x8000; - if (a1->field_0.field_10.field_0 & 0x200000) - a1->field_0.field_2B8 = (int16_t)0x8000; + a1->play_prog = mot->pp_list; + a1->play_prog_org = mot->pp_list; + a1->mh_command = mot->cm_list; + a1->mh_did = mot_db->get_motion_set_id_by_motion_id(motnum); - a1->field_0.field_50 = mot->field_10; - a1->field_0.field_52 = mot->field_12; - if (mot->field_12 & 0x40) { - a1->field_0.field_52 = mot->field_12 & ~0x40; - a1->field_0.field_54 |= 0x40; + a1->motkind_fix.init((uint32_t*)mot->mot_kind.mhk_kind); + a1->motkind.init((uint32_t*)mot->mot_kind.mhk_kind); + + a1->motkind.reset(MK_ATTACK); + if (a1->motkind_fix[MK_TURN]) + a1->mov_yang = (int16_t)0x8000; + if (a1->motkind_fix[MK_DTURN]) + a1->dturn_yang = (int16_t)0x8000; + + a1->start_style = mot->start_style; + a1->end_style = mot->end_style; + + if (mot->end_style & 0x40) { + a1->end_style = mot->end_style & ~0x40; + a1->end_style_flag |= 0x40; } - mothead_apply_mot(a1, rob_chr, mot->mot_data); + a1->mhd_smd_exec(rob_chr, mot->mh_list); - if (a1->field_0.field_58 == 1) - a1->field_0.frame = frame_count - 1.0f; + if (a1->next_type == MH_NEXT_REPEAT) + a1->frame = frame_max - 1.0f; else - a1->field_0.frame = a1->field_0.frame_count; + a1->frame = a1->frame_max; - if (a1->field_0.field_20.field_0 & 0x200000) - a1->field_0.field_20.field_0 |= 0x100; - if (a1->field_0.field_20.field_C & 0x20000 && !(rob_chr->data.field_3D9C & 0x400)) - a1->field_0.field_20.field_C |= 0x400; + if (a1->motkind[MK_DTURN]) + a1->motkind.set(MK_TURN); + if (a1->motkind[MK_REVERSE_ATK_FRONT] && !rob_chr->rob_base.robinfo.en_flag.bit.en_at_front) + a1->motkind.set(MK_PL_SYAGAMI); - a1->field_0.field_C = 0; - a1->field_0.field_274 += a1->field_0.field_2B8; - a1->field_0.field_A0 += a1->field_0.field_2B8; + a1->ex_damage_all = 0; + a1->mov_yang += a1->dturn_yang; + a1->efc_yang += a1->dturn_yang; - const mothead_data* data = mot->data; + MhpList* data = mot->pp_list; if (!data) return; - mothead_data_type type = data->type; + int32_t type = data->type; if (data->type < 0) return; - while (type != MOTHEAD_DATA_TYPE_11) + while (type != MHP_NUM_11) if ((type = (data++)->type) < 0) return; const void* d = data->data; while (d) { - a1->field_0.field_C += *(int16_t*)d; + a1->ex_damage_all += *(int16_t*)d; - mothead_data_type type = (data++)->type; - if (type < MOTHEAD_DATA_TYPE_0) + int32_t type = (data++)->type; + if (type < 0) break; - while (type != MOTHEAD_DATA_TYPE_11) + while (type != MHP_NUM_11) if ((type = (data++)->type) < 0) return; d = data->data; } } -void rob_chara::load_body_parts_object_info(ROB_PARTS_KIND rpk, object_info obj_info, +void rob_chara::set_item(ROB_PARTS_KIND rpk, object_info obj_uid, const bone_database* bone_data, void* data, const object_database* obj_db) { - rob_disp->load_body_parts_object_info(rpk, obj_info, bone_data, data, obj_db); -} - -void rob_chara::load_motion(uint32_t motion_id, bool a3, float_t frame, - MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db) { - data.position.yang = sub_14054FE90(this, false); - if (!(data.motdata.field_0.field_20.field_0 & 0x10)) { - data.position.pos.x = data.position.gpos.x; - data.position.pos.z = data.position.gpos.z; - } - - if (data.motdata.field_0.field_20.field_8 & 0x8000000) - data.position.pos.y = data.position.gpos.y; - - if (a3) - data.motion.field_28 ^= 0x04; - - if (data.motion.field_28 & 0x04) - data.motion.field_28 |= 0x08; - else - data.motion.field_28 &= ~0x08; - - data.motion.field_28 &= 0x2F; - data.motion.field_28 |= 0x10; - data.motion.loop_index = 0; - data.motion.field_30 = 0; - - rob_chara_data_adjust* parts_adjust = data.motion.parts_adjust; - for (int32_t i = 0; i < ROB_OSAGE_PARTS_MAX; i++, parts_adjust++) - parts_adjust->reset(); - - data.motion.adjust_global.reset(); - - data.adjust_data.offset = 0.0f; - data.adjust_data.offset_x = true; - data.adjust_data.offset_y = false; - data.adjust_data.offset_z = true; - data.adjust_data.get_global_pos = false; - - rob_chara_data_arm_adjust* arm_adjust = data.motion.arm_adjust; - rob_chara_data_hand_adjust* hand_adjust = data.motion.hand_adjust; - rob_chara_data_hand_adjust* hand_adjust_prev = data.motion.hand_adjust_prev; - for (int32_t i = 0; i < 2; i++, arm_adjust++, hand_adjust++, hand_adjust_prev++) { - hand_adjust->reset(); - hand_adjust_prev->reset(); - arm_adjust->reset(); - rob_chara_bone_data_set_motion_arm_length(this->bone_data, - rob_motion_c_kata_bone_get(i), 0.0f); - } - this->bone_data->set_disable_eye_motion(false); - - rob_disp->set_osage_move_cancel(0, 0.0f); - for (int32_t i = 0; i < ROB_OSAGE_PARTS_MAX; i++) - rob_disp->set_disable_collision((rob_osage_parts)i, false); - data.motdata.field_0.field_30 = data.motdata.field_0.field_10; - data.motdata.field_0.field_40 = data.motdata.field_0.field_20; - data.motdata.field_0.field_276 = data.motdata.field_0.field_274; - data.motdata.reset(); - sub_14053A9C0(&data.motdata, this, motion_id, - motion_storage_get_mot_data_frame_count(motion_id, mot_db), mot_db); - if (data.motdata.field_0.field_40.field_C & 0x20) - data.motdata.field_0.field_20.field_0 &= ~0x08; - if (data.motdata.field_0.field_40.field_C & 0x40) - data.motdata.field_0.field_20.field_8 |= 0x10000000; - if (!(data.motdata.field_0.field_20.field_0 & 0x10) && frame > 0.0f) - data.motdata.field_0.field_20.field_0 &= ~0x08; - - data.motion.prev_motion_id = data.motion.motion_id; - data.motion.frame_data.frame = frame; - data.motion.field_24 = 0; - data.motion.motion_id = motion_id; - if (data.motion.step_data.step < 0.0f) - data.motion.step_data.frame = 1.0f; - else - data.motion.step_data.frame = data.motion.step_data.step; - - float_t step = data.motion.step; - if (step < 0.0f) - step = data.motion.step_data.frame; - rob_disp->set_osage_step(step); - - rob_chara_bone_data_motion_load(this->bone_data, motion_id, blend_type, bone_data, mot_db); - this->bone_data->set_motion_frame(data.motion.step_data.frame, - data.motion.step_data.frame, data.motdata.field_0.frame_count); - this->bone_data->set_motion_playback_state(MOT_PLAY_FRAME_DATA_PLAYBACK_FORWARD); - if (data.motdata.field_0.field_58 == 1) { - this->bone_data->set_motion_loop_state(MOT_PLAY_FRAME_DATA_LOOP_CONTINUOUS); - this->bone_data->set_motion_loop(data.motdata.field_0.loop_begin, - data.motdata.field_0.loop_count, -1.0f); - } - rob_chara_bone_data_set_rot_y(this->bone_data, - (float_t)((double_t)data.motdata.field_0.field_2B8 * M_PI * (1.0 / 32768.0))); - sub_14041BC40(this->bone_data, !!(data.motdata.field_0.field_20.field_8 & 0x20000000)); - sub_14041B9D0(this->bone_data); - if (type == ROB_CHARA_TYPE_2) { - sub_14041D340(this->bone_data, !!(data.motdata.field_0.field_54 & 0x40)); - sub_14041D6C0(this->bone_data, (data.motdata.field_0.field_40.field_0 & 0x10) - && (data.motdata.field_0.field_20.field_0 & 0x08)); - sub_14041D6F0(this->bone_data, - !!(data.motdata.field_0.field_10.field_8 & 0x18000000)); - sub_14041D720(this->bone_data, - !!(data.motdata.field_0.field_30.field_8 & 0x18000000)); - sub_14041D2A0(this->bone_data, - (float_t)((double_t)data.motdata.field_0.field_276 * M_PI * (1.0 / 32768.0))); - sub_14041D270(this->bone_data, - (float_t)((double_t)data.motdata.field_0.field_274 * M_PI * (1.0 / 32768.0))); - } - else - sub_140555B00(this, blend_type >= MOTION_BLEND_FREEZE && blend_type <= MOTION_BLEND_CROSS); - data.field_3DE0 = 0; -} - -void rob_chara::load_outfit_object_info(ROB_PARTS_KIND rpk, object_info obj_info, - bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db) { - rob_disp->load_outfit_object_info(rpk, obj_info, osage_reset, bone_data, data, obj_db); + disp->set_item(rpk, obj_uid, bone_data, data, obj_db); } static void rob_chara_head_adjust(rob_chara* rob_chr); static bool rob_chara_hands_adjust(rob_chara* rob_chr); -static bool sub_14053B580(rob_chara* rob_chr, int32_t a2); +static bool sub_14053B580(rob_chara* rob_chr, MotLeafCtrlPart part); static void sub_14053B260(rob_chara* rob_chr); static bool sub_14053B530(rob_chara* rob_chr) { - return sub_14053B580(rob_chr, 2) | sub_14053B580(rob_chr, 3); + return sub_14053B580(rob_chr, LCPART_ASI_R) | sub_14053B580(rob_chr, LCPART_ASI_L); } static void rob_chara_bone_data_set_left_hand_scale(rob_chara_bone_data* rob_bone_data, float_t scale) { @@ -3622,13 +4130,13 @@ static void rob_chara_bone_data_set_right_hand_scale(rob_chara_bone_data* rob_bo // 0x140550400 void rob_chara::pos_reset() { - rob_disp->pos_reset(0); + disp->pos_reset(0); } void rob_chara::rob_info_ctrl() { - data.field_3DA0 = data.field_3D9C; - if (data.field_1E68.field_64 > 0.01f) - data.flag.bit.wall_moved_mot = 1; + rob_base.robinfo.old_en_flag = rob_base.robinfo.en_flag; + if (rob_base.collision.fld_on > 0.01f) + rob_base.flag.bit.wall_moved_mot = 1; //sub_140517CC0(this); //sub_140517B80(this); @@ -3646,20 +4154,20 @@ void rob_chara::rob_motion_modifier_ctrl() { if (!sub_14053B530(this)) sub_14053B260(this); - float_t left_hand_scale_default = data.adjust_data.left_hand_scale_default; - float_t right_hand_scale_default = data.adjust_data.right_hand_scale_default; - float_t left_hand_scale = data.adjust_data.left_hand_scale; - float_t right_hand_scale = data.adjust_data.right_hand_scale; + float_t left_hand_scale_default = rob_base.adjust.left_hand_scale_default; + float_t right_hand_scale_default = rob_base.adjust.right_hand_scale_default; + float_t left_hand_scale = rob_base.adjust.left_hand_scale; + float_t right_hand_scale = rob_base.adjust.right_hand_scale; if (left_hand_scale_default > 0.0f) if (left_hand_scale <= 0.0f) - left_hand_scale = data.adjust_data.left_hand_scale_default; + left_hand_scale = rob_base.adjust.left_hand_scale_default; else left_hand_scale *= left_hand_scale_default; if (right_hand_scale_default > 0.0f) if (right_hand_scale <= 0.0f) - right_hand_scale = data.adjust_data.right_hand_scale_default; + right_hand_scale = rob_base.adjust.right_hand_scale_default; else right_hand_scale *= right_hand_scale_default; @@ -3670,6 +4178,40 @@ void rob_chara::rob_motion_modifier_ctrl() { rob_chara_bone_data_set_right_hand_scale(bone_data, right_hand_scale); } +bool rob_chara::replace_rob_motion(uint32_t motnum, float_t frame, + float_t blend_duration, bool blend, bool set_motion_reset_data, MotionBlendType blend_type, + const bone_database* bone_data, const motion_database* mot_db) { + if (!blend && rob_base.robmot.num == motnum) + return false; + + if (blend_duration <= 0.0f) + blend_type = MOTION_BLEND; + set_rob_motion(motnum, false, frame, blend_type, bone_data, mot_db); + this->bone_data->set_motion_blend_duration(blend_duration, 1.0f, 0.0f); + rob_base.robmot.flag.bit.ext_frame_req = true; + rob_base.robmot.frame.req_f = frame; + set_motion_skin_param(motnum, (float_t)(int32_t)frame); + if (blend_duration == 0.0f) { + if (set_motion_reset_data) + rob_chara::set_motion_reset_data(motnum, frame); + + disp->skin_disp[RPK_TE_L].init_cnt = 60; + disp->skin_disp[RPK_TE_R].init_cnt = 60; + + if (check_for_ageageagain_module()) { + rob_chara_age_age_array_set_skip(idnm, 1); + rob_chara_age_age_array_set_skip(idnm, 2); + } + } + return true; +} + +// 0x140516790 +void rob_chara::req_frame_change(float_t frame) { + rob_base.robmot.flag.bit.ext_frame_req = true; + rob_base.robmot.frame.req_f = frame; +} + static const struc_243& sub_140510550(CHARA_NUM chara_num) { static const struc_243 stru_1411AD680[] = { { @@ -3787,133 +4329,153 @@ static const rob_chara_look_anim_eye_param* rob_chara_look_anim_eye_param_array_ return &rob_chara_look_anim_eye_param_array[chara_num]; } -static void sub_140514130(rob_chara_item_equip* rob_disp, ROB_PARTS_KIND rpk, bool a3) { - if (a3) - rob_disp->parts_attr[rpk] &= ~0x01; - else - rob_disp->parts_attr[rpk] |= 0x01; -} - -static void sub_140514110(rob_chara_item_equip* rob_disp, ROB_PARTS_KIND rpk, bool a3) { - if (a3) - rob_disp->parts_attr[rpk] &= ~0x02; - else - rob_disp->parts_attr[rpk] |= 0x02; -} - -static void sub_140513C60(rob_chara_item_equip* rob_disp, ROB_PARTS_KIND rpk, bool a3) { - if (a3) - rob_disp->parts_attr[rpk] &= ~0x04; - else - rob_disp->parts_attr[rpk] |= 0x04; -} - -void rob_chara::reset_data(const rob_chara_pv_data* pv_data, +void rob_chara::reset_rob(const RobInit& robinit, const bone_database* bone_data, const motion_database* mot_db) { + int32_t drank_count = rob_base.action.drank_count; this->bone_data->reset(); - rob_chara_bone_data_init_data(this->bone_data, - BONE_KIND_CMN, rob_data->skeleton_type, bone_data); - data.reset(); - data_prev.reset(); - rob_disp->set_motion_node(rob_chara_bone_data_get_node( + rob_chara_bone_data_init_data(this->bone_data, BONE_KIND_CMN, rob_data->bone, bone_data); + rob_base.init(); + rob_base_old.init(); + disp->set_motion_node(rob_chara_bone_data_get_node( this->bone_data, BONE_NODE_N_HARA_CP), bone_data); - type = pv_data->type; - rob_chara_data* base = &data; - base->position.yang = pv_data->yang; - base->position.hara_yang = pv_data->yang; - float_t scale = chara_size_table_get_value(this->pv_data.chara_size_index); - base->adjust_data.scale = scale; - base->adjust_data.item_scale = scale; // X - base->adjust_data.height_adjust = this->pv_data.height_adjust; - base->adjust_data.pos_adjust_y = chara_pos_adjust_y_table_get_value(this->pv_data.chara_size_index); + type = robinit.rob_type; + set_disp_flag(robinit.disp); + energy = robinit.energy; + frame_speed = 1.0f; + + RobBase* base = &rob_base; + + vec3 pos = robinit.pos; + if (robinit.rob_type != ROB_TYPE_AUTH) { + vec3 check_pnt = robinit.pos; + check_pnt.y += 1.0f; + //pos.y = field_get_hit_y(check_pnt, 0.0f); + } + + base->position.pos = pos; + base->position.gpos = pos; + base->position.old_gpos = pos; + base->position.yang = robinit.yang; + base->position.hara_yang = robinit.yang; + float_t scale = chara_size_table_get_value(rob_init.chara_size_index); + base->adjust.scale = scale; + base->adjust.item_scale = scale; // X + base->adjust.height_adjust = rob_init.height_adjust; + base->adjust.pos_adjust_y = chara_pos_adjust_y_table_get_value(rob_init.chara_size_index); base->action.kamae_data = rob_data->kamae_tbl[base->action.kamae_type]; sub_14041C5C0(this->bone_data, sub_140510550(chara_num)); rob_chara_bone_data_set_look_anim_param(this->bone_data, - rob_chara_look_anim_eye_param_array_get(chara_num), &pv_data->eyes_adjust); - this->bone_data->sleeve_adjust.sleeve_l = pv_data->sleeve_l; - this->bone_data->sleeve_adjust.sleeve_r = pv_data->sleeve_r; + rob_chara_look_anim_eye_param_array_get(chara_num), &robinit.eyes_adjust); + this->bone_data->sleeve_adjust.sleeve_l = robinit.sleeve_l; + this->bone_data->sleeve_adjust.sleeve_r = robinit.sleeve_r; this->bone_data->sleeve_adjust.enable1 = true; this->bone_data->sleeve_adjust.enable2 = false; - rob_chara_bone_data_get_ik_scale(this->bone_data, bone_data); + rob_chara_bone_data_get_adjust_scale(this->bone_data, bone_data); rob_chara_load_default_motion(this, bone_data, mot_db); - base->action.field_4.field_0 = 1; - base->action.field_4.motion_id = get_rob_cmn_mottbl_motion_id(0); - base->action.field_0 = 0; - base->action.field_4.field_10 = pv_data->field_5; - load_motion(base->action.field_4.motion_id, pv_data->field_5, 0.0f, MOTION_BLEND, bone_data, mot_db); - field_C = true; - rob_disp->field_DC = 0; - sub_140513C60(rob_disp, RPK_ATAMA, false); - sub_140513C60(rob_disp, RPK_TE_R, false); - sub_140513C60(rob_disp, RPK_TE_L, false); + base->action.action.name = ROB_ACT_MOTION; + base->action.action.motnum = get_common_mot(MTP_NONE); + base->action.step = 0; + base->action.action.mirror = robinit.mirror; + set_rob_motion(base->action.action.motnum, robinit.mirror, 0.0f, MOTION_BLEND, bone_data, mot_db); + if (!robinit.drank_reset) + base->action.drank_count = drank_count; + reset_osage_pos(); + disp->hyoutan_status = HYOUTAN_STAT_NORMAL; + disp->set_merge(RPK_ATAMA, false); + disp->set_merge(RPK_TE_R, false); + disp->set_merge(RPK_TE_L, false); object_info head_obj = rob_chara_get_head_object(this, 0); - base->motion.field_150.head_object = head_obj; - base->motion.field_3B0.head_object = head_obj; + base->robmot.field_150.head_object = head_obj; + base->robmot.field_3B0.head_object = head_obj; set_parts_disp(RPK_MAX, true); } void rob_chara::reset_osage() { - for (rob_chara_data_adjust& i : data.motion.parts_adjust) + for (rob_chara_data_adjust& i : rob_base.robmot.parts_adjust) i.reset(); - for (rob_chara_data_adjust& i : data.motion.parts_adjust_prev) + for (rob_chara_data_adjust& i : rob_base.robmot.parts_adjust_prev) i.reset(); for (int32_t i = 0; i < ROB_OSAGE_PARTS_MAX; i++) - rob_disp->reset_nodes_ex_force((rob_osage_parts)i); + disp->reset_nodes_ex_force((rob_osage_parts)i); - data.motion.adjust_global.reset(); - data.motion.adjust_global_prev.reset(); + rob_base.robmot.adjust_global.reset(); + rob_base.robmot.adjust_global_prev.reset(); - rob_disp->reset_ex_force(); - rob_disp->parts_short = false; - rob_disp->parts_append = false; - rob_disp->parts_white_one_l = false; + disp->reset_ex_force(); + disp->parts_short = false; + disp->parts_append = false; + disp->parts_white_one_l = false; set_osage_step(-1.0f); } +void rob_chara::reset_osage_pos() { + disp_pos_reset = true; +} + +void rob_chara::set_base(ROB_PARTS_KIND rpk, object_info obj_info, bool osage_reset, + const bone_database* bone_data, void* data, const object_database* obj_db) { + disp->set_base(rpk, obj_info, osage_reset, bone_data, data, obj_db); +} + void rob_chara::set_bone_data_frame(float_t frame) { bone_data->set_frame(frame); bone_data->interpolate(); bone_data->update(0); } +// 0x140506D20 +void rob_chara::set_chara(ROB_ID id, CHARA_NUM cn, int32_t cos_id, const RobInit& ri) { + idnm = (int8_t)id; + chara_num = cn; + this->cos_id = cos_id; + rob_init = ri; + rob_data = get_rob_data(cn); + if (!check_cos_id_is_501(cos_id)) { + const RobItemEquip* item_set = get_default_costume_data(cn, cos_id); + if (item_set) + RobItem::s_regist_item_all(cn, item_set, &item); + } + item.regist_item_all(&ri.item); +} + void rob_chara::set_chara_color(bool value) { - rob_disp->chara_color = value; + disp->chara_color = value; } void rob_chara::set_chara_height_adjust(bool value) { - data.adjust_data.height_adjust = value; + rob_base.adjust.height_adjust = value; } void rob_chara::set_chara_pos_adjust(const vec3& value) { - data.adjust_data.pos_adjust = value; + rob_base.adjust.pos_adjust = value; } void rob_chara::set_chara_pos_adjust_y(float_t value) { - data.adjust_data.pos_adjust_y = value; + rob_base.adjust.pos_adjust_y = value; } void rob_chara::set_chara_size(float_t value) { - data.adjust_data.scale = value; - data.adjust_data.item_scale = value; // X + rob_base.adjust.scale = value; + rob_base.adjust.item_scale = value; // X } static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, RobEyelidMotion* motion, int32_t type, const motion_database* mot_db) { if (type == 1 || type == 2) { - rob_chr->data.motion.field_3B0.eyelid.data = motion->data; - if (!(rob_chr->data.motion.field_29 & 0x80)) + rob_chr->rob_base.robmot.field_3B0.eyelid.data = motion->data; + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x8000)) return; } else { - rob_chr->data.motion.field_150.eyelid.data = motion->data; - if (rob_chr->data.motion.field_29 & 0x80) + rob_chr->rob_base.robmot.field_150.eyelid.data = motion->data; + if (rob_chr->rob_base.robmot.flag.u32 & 0x8000) return; } - rob_chr->bone_data->load_eyelid_motion(motion->data.motion_id, mot_db); + rob_chr->bone_data->load_eyelid_motion(motion->data.motnum, mot_db); rob_chr->bone_data->set_eyelid_frame(motion->data.frame); rob_chr->bone_data->set_eyelid_step(motion->data.step); rob_chr->bone_data->set_eyelid_blend_duration( @@ -3923,17 +4485,17 @@ static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, static void rob_chara_set_eyes_motion(rob_chara* rob_chr, RobEyesMotion* motion, int32_t type, const motion_database* mot_db) { if (type == 1 || type == 2) { - rob_chr->data.motion.field_3B0.eyes.data = motion->data; - if (!(rob_chr->data.motion.field_29 & 0x40)) + rob_chr->rob_base.robmot.field_3B0.eyes.data = motion->data; + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x4000)) return; } else { - rob_chr->data.motion.field_150.eyes.data = motion->data; - if (rob_chr->data.motion.field_29 & 0x40) + rob_chr->rob_base.robmot.field_150.eyes.data = motion->data; + if (rob_chr->rob_base.robmot.flag.u32 & 0x4000) return; } - rob_chr->bone_data->load_eyes_motion(motion->data.motion_id, mot_db); + rob_chr->bone_data->load_eyes_motion(motion->data.motnum, mot_db); rob_chr->bone_data->set_eyes_frame(motion->data.frame); rob_chr->bone_data->set_eyes_step(motion->data.step); rob_chr->bone_data->set_eyes_blend_duration( @@ -3943,17 +4505,17 @@ static void rob_chara_set_eyes_motion(rob_chara* rob_chr, static void rob_chara_set_face_motion(rob_chara* rob_chr, RobFaceMotion* motion, int32_t type, const motion_database* mot_db) { if (type == 2 || type == 1) { - rob_chr->data.motion.field_3B0.face.data = motion->data; - if (!(rob_chr->data.motion.field_29 & 0x04)) + rob_chr->rob_base.robmot.field_3B0.face.data = motion->data; + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x0400)) return; } else { - rob_chr->data.motion.field_150.face.data = motion->data; - if (rob_chr->data.motion.field_29 & 0x04) + rob_chr->rob_base.robmot.field_150.face.data = motion->data; + if (rob_chr->rob_base.robmot.flag.u32 & 0x0400) return; } - rob_chr->bone_data->load_face_motion(motion->data.motion_id, mot_db); + rob_chr->bone_data->load_face_motion(motion->data.motnum, mot_db); rob_chr->bone_data->set_face_frame(motion->data.frame); rob_chr->bone_data->set_face_step(motion->data.step); rob_chr->bone_data->set_face_blend_duration( @@ -3965,23 +4527,23 @@ static void rob_chara_set_hand_l_motion(rob_chara* rob_chr, switch (type) { case 0: default: - rob_chr->data.motion.field_150.hand_l.data = motion->data; - if ((rob_chr->data.motion.field_29 & 0x08) || (rob_chr->data.motion.field_2A & 0x04)) + rob_chr->rob_base.robmot.field_150.hand_l.data = motion->data; + if ((rob_chr->rob_base.robmot.flag.u32 & 0x0800) || (rob_chr->rob_base.robmot.flag.u32 & 0x040000)) return; break; case 1: - rob_chr->data.motion.hand_l.data = motion->data; - if ((rob_chr->data.motion.field_29 & 0x08) || !(rob_chr->data.motion.field_2A & 0x04)) + rob_chr->rob_base.robmot.hand_l.data = motion->data; + if ((rob_chr->rob_base.robmot.flag.u32 & 0x0800) || !(rob_chr->rob_base.robmot.flag.u32 & 0x040000)) return; break; case 2: - rob_chr->data.motion.field_3B0.hand_l.data = motion->data; - if (!(rob_chr->data.motion.field_29 & 0x08) || (rob_chr->data.motion.field_2A & 0x04)) + rob_chr->rob_base.robmot.field_3B0.hand_l.data = motion->data; + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x0800) || (rob_chr->rob_base.robmot.flag.u32 & 0x040000)) return; break; } - rob_chr->bone_data->load_hand_l_motion(motion->data.motion_id, mot_db); + rob_chr->bone_data->load_hand_l_motion(motion->data.motnum, mot_db); rob_chr->bone_data->set_hand_l_frame(motion->data.frame); rob_chr->bone_data->set_hand_l_step(motion->data.step); rob_chr->bone_data->set_hand_l_blend_duration( @@ -3993,23 +4555,23 @@ static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, switch (type) { case 0: default: - rob_chr->data.motion.field_150.hand_r.data = motion->data; - if ((rob_chr->data.motion.field_29 & 0x10) || (rob_chr->data.motion.field_2A & 0x08)) + rob_chr->rob_base.robmot.field_150.hand_r.data = motion->data; + if ((rob_chr->rob_base.robmot.flag.u32 & 0x1000) || (rob_chr->rob_base.robmot.flag.u32 & 0x080000)) return; break; case 1: - rob_chr->data.motion.hand_r.data = motion->data; - if ((rob_chr->data.motion.field_29 & 0x10) || !(rob_chr->data.motion.field_2A & 0x08)) + rob_chr->rob_base.robmot.hand_r.data = motion->data; + if ((rob_chr->rob_base.robmot.flag.u32 & 0x1000) || !(rob_chr->rob_base.robmot.flag.u32 & 0x080000)) return; break; case 2: - rob_chr->data.motion.field_3B0.hand_r.data = motion->data; - if (!(rob_chr->data.motion.field_29 & 0x10) || (rob_chr->data.motion.field_2A & 0x08)) + rob_chr->rob_base.robmot.field_3B0.hand_r.data = motion->data; + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x1000) || (rob_chr->rob_base.robmot.flag.u32 & 0x080000)) return; break; } - rob_chr->bone_data->load_hand_r_motion(motion->data.motion_id, mot_db); + rob_chr->bone_data->load_hand_r_motion(motion->data.motnum, mot_db); rob_chr->bone_data->set_hand_r_frame(motion->data.frame); rob_chr->bone_data->set_hand_r_step(motion->data.step); rob_chr->bone_data->set_hand_r_blend_duration( @@ -4019,17 +4581,17 @@ static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, static void rob_chara_set_mouth_motion(rob_chara* rob_chr, RobMouthMotion* motion, int32_t type, const motion_database* mot_db) { if (type == 1 || type == 2) { - rob_chr->data.motion.field_3B0.mouth.data = motion->data; - if (!(rob_chr->data.motion.field_29 & 0x20)) + rob_chr->rob_base.robmot.field_3B0.mouth.data = motion->data; + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x2000)) return; } else { - rob_chr->data.motion.field_150.mouth.data = motion->data; - if (rob_chr->data.motion.field_29 & 0x20) + rob_chr->rob_base.robmot.field_150.mouth.data = motion->data; + if (rob_chr->rob_base.robmot.flag.u32 & 0x2000) return; } - rob_chr->bone_data->load_mouth_motion(motion->data.motion_id, mot_db); + rob_chr->bone_data->load_mouth_motion(motion->data.motnum, mot_db); rob_chr->bone_data->set_mouth_frame(motion->data.frame); rob_chr->bone_data->set_mouth_step(motion->data.step); rob_chr->bone_data->set_mouth_blend_duration( @@ -4037,57 +4599,57 @@ static void rob_chara_set_mouth_motion(rob_chara* rob_chr, } static void sub_1405500F0(rob_chara* rob_chr) { - rob_chr->data.motion.field_29 &= ~0x01; - int32_t v1 = rob_chr->data.motion.field_150.field_1C0; + rob_chr->rob_base.robmot.flag.u32 &= ~0x0100; + int32_t v1 = rob_chr->rob_base.robmot.field_150.field_1C0; if (v1 == 2 || v1 == 3) return; - switch (rob_chr->data.motion.field_150.face.data.mottbl_index) { - case 0x07: // FACE_RESET - case 0x09: // FACE_RESET_OLD - case 0x0B: // FACE_SAD - case 0x0D: // FACE_SAD_OLD - case 0x13: // FACE_SURPRISE - case 0x15: // FACE_SURPRISE_OLD - case 0x19: // FACE_ADMIRATION - case 0x1B: // FACE_ADMIRATION_OLD - case 0x1D: // FACE_SMILE - case 0x1F: // FACE_SMILE_OLD - case 0x21: // FACE_SETTLED - case 0x23: // FACE_SETTLED_OLD - case 0x25: // FACE_DAZZLING - case 0x27: // FACE_DAZZLING_OLD - case 0x29: // FACE_LASCIVIOUS - case 0x2B: // FACE_LASCIVIOUS_OLD - case 0x2D: // FACE_STRONG - case 0x2F: // FACE_STRONG_OLD - case 0x31: // FACE_CLARIFYING - case 0x33: // FACE_CLARIFYING_OLD - case 0x35: // FACE_GENTLE - case 0x37: // FACE_GENTLE_OLD - case 0x41: // FACE_NAGASI - case 0x43: // FACE_NAGASI_OLD - case 0x45: // FACE_KIRI - case 0x47: // FACE_KIRI_OLD - case 0x49: // FACE_UTURO - case 0x4B: // FACE_UTURO_OLD - case 0x4D: // FACE_OMOU - case 0x4F: // FACE_OMOU_OLD - case 0x51: // FACE_SETUNA - case 0x53: // FACE_SETUNA_OLD - case 0x55: // FACE_GENKI - case 0x57: // FACE_GENKI_OLD - case 0x59: // FACE_YARU - case 0x5B: // FACE_YARU_OLD - case 0x5D: // FACE_COOL - case 0x5F: // FACE_KOMARIWARAI - case 0x61: // FACE_KUMON - case 0x63: // FACE_KUTSUU - case 0x65: // FACE_NAKI - case 0x67: // FACE_NAYAMI - case 0x69: // FACE_SUPSERIOUS - case 0x6B: // FACE_TSUYOKIWARAI - rob_chr->data.motion.field_29 |= 0x01; + switch (rob_chr->rob_base.robmot.field_150.face.data.mottbl_type) { + case MTP_FACE_RESET: + case MTP_FACE_RESET_OLD: + case MTP_FACE_SAD: + case MTP_FACE_SAD_OLD: + case MTP_FACE_SURPRISE: + case MTP_FACE_SURPRISE_OLD: + case MTP_FACE_ADMIRATION: + case MTP_FACE_ADMIRATION_OLD: + case MTP_FACE_SMILE: + case MTP_FACE_SMILE_OLD: + case MTP_FACE_SETTLED: + case MTP_FACE_SETTLED_OLD: + case MTP_FACE_DAZZLING: + case MTP_FACE_DAZZLING_OLD: + case MTP_FACE_LASCIVIOUS: + case MTP_FACE_LASCIVIOUS_OLD: + case MTP_FACE_STRONG: + case MTP_FACE_STRONG_OLD: + case MTP_FACE_CLARIFYING: + case MTP_FACE_CLARIFYING_OLD: + case MTP_FACE_GENTLE: + case MTP_FACE_GENTLE_OLD: + case MTP_FACE_NAGASI: + case MTP_FACE_NAGASI_OLD: + case MTP_FACE_KIRI: + case MTP_FACE_KIRI_OLD: + case MTP_FACE_UTURO: + case MTP_FACE_UTURO_OLD: + case MTP_FACE_OMOU: + case MTP_FACE_OMOU_OLD: + case MTP_FACE_SETUNA: + case MTP_FACE_SETUNA_OLD: + case MTP_FACE_GENKI: + case MTP_FACE_GENKI_OLD: + case MTP_FACE_YARU: + case MTP_FACE_YARU_OLD: + case MTP_FACE_COOL: + case MTP_FACE_KOMARIWARAI: + case MTP_FACE_KUMON: + case MTP_FACE_KUTSUU: + case MTP_FACE_NAKI: + case MTP_FACE_NAYAMI: + case MTP_FACE_SUPSERIOUS: + case MTP_FACE_TSUYOKIWARAI: + rob_chr->rob_base.robmot.flag.bit.suspend = 1; break; } } @@ -4096,7 +4658,7 @@ static vec3* rob_chara_bone_data_get_gblctr_pos(rob_chara_bone_data* rob_bone_da return &rob_bone_data->motion_loaded.front()->bone_data.gblctr_pos; } -static void rob_chara_data_adjuct_set_pos(rob_chara_adjust_data* rob_chr_adj, +static void rob_chara_data_adjuct_set_pos(RobAdjust* rob_chr_adj, const vec3& pos, bool pos_adjust, const vec3* gblctr_pos) { float_t scale = rob_chr_adj->scale; float_t item_scale = rob_chr_adj->item_scale; // X @@ -4139,7 +4701,7 @@ static void rob_chara_data_adjuct_set_pos(rob_chara_adjust_data* rob_chr_adj, rob_chr_adj->item_pos = _item_pos - pos * item_scale; // X } -void rob_chara::set_data_adjust_mat(rob_chara_adjust_data* rob_chr_adj, bool pos_adjust) { +void rob_chara::set_data_adjust_mat(RobAdjust* rob_chr_adj, bool pos_adjust) { mat4* mat = bone_data->get_mats_mat(BONE_ID_N_HARA_CP); vec3 pos; @@ -4159,43 +4721,51 @@ void rob_chara::set_data_adjust_mat(rob_chara_adjust_data* rob_chr_adj, bool pos mat4_set_translation(&rob_chr_adj->item_mat, &rob_chr_adj->item_pos); } -void rob_chara::set_base_position_pos(const vec3& value) { - data.position.pos = value; -} - -void rob_chara::set_base_position_yang(const RobAngle& value) { - data.position.yang = value; -} - void rob_chara::set_disable_collision(rob_osage_parts parts, bool disable) { - rob_disp->set_disable_collision(parts, disable); + disp->set_disable_collision(parts, disable); } -void rob_chara::set_eyelid_mottbl_motion(int32_t type, int32_t mottbl_index, +void rob_chara::set_disp_flag(bool flag) { + if (flag) { + rob_base.flag.bit.disp = 1; + rob_base.flag.bit.yoketa = 1; + } + else { + rob_base.flag.bit.disp = 0; + rob_base.flag.bit.yoketa = 0; + } + + if (check_for_ageageagain_module()) { + rob_chara_age_age_array_set_disp(idnm, 1, flag); + rob_chara_age_age_array_set_disp(idnm, 2, flag); + } +} + +void rob_chara::set_eyelid_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobEyelidMotion motion; - motion.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.mottbl_index = mottbl_index; + motion.data.motnum = get_common_mot(mottbl_type); + motion.data.mottbl_type = mottbl_type; motion.data.playback_state = playback_state; motion.data.step = step; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &data.motion.frame_data; - motion.data.step_data = &data.motion.step_data; + motion.data.frame_ptr = &rob_base.robmot.frame; + motion.data.step_ptr = &rob_base.robmot.step; } motion.data.loop_state = loop_state; - if (motion.data.motion_id != -1) { - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion.data.motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + if (motion.data.motnum != -1) { + motion.data.frame_max = get_mot_frame_max(motion.data.motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } if (!type) { - data.motion.field_29 &= ~2; - data.motion.field_150.time = 0.0f; + rob_base.robmot.flag.u32 &= ~0x0200; + rob_base.robmot.field_150.time = 0.0f; } rob_chara_set_eyelid_motion(this, &motion, type, mot_db); } @@ -4203,185 +4773,185 @@ void rob_chara::set_eyelid_mottbl_motion(int32_t type, int32_t mottbl_index, void rob_chara::set_eyelid_mottbl_motion_from_face(int32_t a2, float_t blend_duration, float_t value, float_t blend_offset, const motion_database* mot_db) { if (!a2) - a2 = data.motion.field_150.field_1C0; + a2 = rob_base.robmot.field_150.field_1C0; RobEyelidMotion motion; switch (a2) { case 0: case 2: - motion.data = data.motion.field_150.face.data; + motion.data = rob_base.robmot.field_150.face.data; break; case 1: value = 1.0f; case 3: { - int32_t mottbl_index = data.motion.field_150.face.data.mottbl_index; - switch (mottbl_index) { - case 0x07: // FACE_RESET - case 0x09: // FACE_RESET_OLD - case 0x0B: // FACE_SAD - case 0x0D: // FACE_SAD_OLD - case 0x0F: // FACE_LAUGH - case 0x11: // FACE_LAUGH_OLD - case 0x13: // FACE_SURPRISE - case 0x15: // FACE_SURPRISE_OLD - case 0x17: // FACE_WINK_OLD - case 0x19: // FACE_ADMIRATION - case 0x1B: // FACE_ADMIRATION_OLD - case 0x1D: // FACE_SMILE - case 0x1F: // FACE_SMILE_OLD - case 0x21: // FACE_SETTLED - case 0x23: // FACE_SETTLED_OLD - case 0x25: // FACE_DAZZLING - case 0x27: // FACE_DAZZLING_OLD - case 0x29: // FACE_LASCIVIOUS - case 0x2B: // FACE_LASCIVIOUS_OLD - case 0x2D: // FACE_STRONG - case 0x2F: // FACE_STRONG_OLD - case 0x31: // FACE_CLARIFYING - case 0x33: // FACE_CLARIFYING_OLD - case 0x35: // FACE_GENTLE - case 0x37: // FACE_GENTLE_OLD - case 0x3D: // FACE_CLOSE - case 0x3F: // FACE_CLOSE_OLD - case 0x41: // FACE_NAGASI - case 0x43: // FACE_NAGASI_OLD - case 0x45: // FACE_KIRI - case 0x47: // FACE_KIRI_OLD - case 0x49: // FACE_UTURO - case 0x4B: // FACE_UTURO_OLD - case 0x4D: // FACE_OMOU - case 0x4F: // FACE_OMOU_OLD - case 0x51: // FACE_SETUNA - case 0x53: // FACE_SETUNA_OLD - case 0x55: // FACE_GENKI - case 0x57: // FACE_GENKI_OLD - case 0x59: // FACE_YARU - case 0x5B: // FACE_YARU_OLD - case 0x5D: // FACE_COOL - case 0x5F: // FACE_KOMARIWARAI - case 0x61: // FACE_KUMON - case 0x63: // FACE_KUTSUU - case 0x65: // FACE_NAKI - case 0x67: // FACE_NAYAMI - case 0x69: // FACE_SUPSERIOUS - case 0x6B: // FACE_TSUYOKIWARAI - case 0x6D: // FACE_WINK_L - case 0x6F: // FACE_WINK_R - case 0x71: // FACE_WINKG_L - case 0x73: // FACE_WINKG_R - case 0x7F: // FACE_WINK_OLD - case 0x81: // FACE_NEW_IKARI_OLD - case 0xEC: // FACE_EYEBROW_UP_RIGHT - case 0xEE: // FACE_EYEBROW_UP_LEFT - case 0xF0: // FACE_KOMARIEGAO - case 0xF2: // FACE_KONWAKU - motion.data.mottbl_index = ++mottbl_index; + uint32_t mottbl_type = rob_base.robmot.field_150.face.data.mottbl_type; + switch (mottbl_type) { + case MTP_FACE_RESET: + case MTP_FACE_RESET_OLD: + case MTP_FACE_SAD: + case MTP_FACE_SAD_OLD: + case MTP_FACE_LAUGH: + case MTP_FACE_LAUGH_OLD: + case MTP_FACE_SURPRISE: + case MTP_FACE_SURPRISE_OLD: + case MTP_FACE_WINK_OLD: + case MTP_FACE_ADMIRATION: + case MTP_FACE_ADMIRATION_OLD: + case MTP_FACE_SMILE: + case MTP_FACE_SMILE_OLD: + case MTP_FACE_SETTLED: + case MTP_FACE_SETTLED_OLD: + case MTP_FACE_DAZZLING: + case MTP_FACE_DAZZLING_OLD: + case MTP_FACE_LASCIVIOUS: + case MTP_FACE_LASCIVIOUS_OLD: + case MTP_FACE_STRONG: + case MTP_FACE_STRONG_OLD: + case MTP_FACE_CLARIFYING: + case MTP_FACE_CLARIFYING_OLD: + case MTP_FACE_GENTLE: + case MTP_FACE_GENTLE_OLD: + case MTP_FACE_CLOSE: + case MTP_FACE_CLOSE_OLD: + case MTP_FACE_NAGASI: + case MTP_FACE_NAGASI_OLD: + case MTP_FACE_KIRI: + case MTP_FACE_KIRI_OLD: + case MTP_FACE_UTURO: + case MTP_FACE_UTURO_OLD: + case MTP_FACE_OMOU: + case MTP_FACE_OMOU_OLD: + case MTP_FACE_SETUNA: + case MTP_FACE_SETUNA_OLD: + case MTP_FACE_GENKI: + case MTP_FACE_GENKI_OLD: + case MTP_FACE_YARU: + case MTP_FACE_YARU_OLD: + case MTP_FACE_COOL: + case MTP_FACE_KOMARIWARAI: + case MTP_FACE_KUMON: + case MTP_FACE_KUTSUU: + case MTP_FACE_NAKI: + case MTP_FACE_NAYAMI: + case MTP_FACE_SUPSERIOUS: + case MTP_FACE_TSUYOKIWARAI: + case MTP_FACE_WINK_L: + case MTP_FACE_WINK_R: + case MTP_FACE_WINKG_L: + case MTP_FACE_WINKG_R: + case MTP_FACE_WINK_FT_OLD: + case MTP_FACE_NEW_IKARI_OLD: + case MTP_FACE_EYEBROW_UP_RIGHT: + case MTP_FACE_EYEBROW_UP_LEFT: + case MTP_FACE_KOMARIEGAO: + case MTP_FACE_KONWAKU: + motion.data.mottbl_type = (MOTTABLE_TYPE)++mottbl_type; break; } - uint32_t motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.motion_id = motion_id; - if (motion_id == -1) { + uint32_t motnum = get_common_mot((MOTTABLE_TYPE)mottbl_type); + motion.data.motnum = motnum; + if (motnum == -1) { blend_duration = 0.0f; a2 = 0; - motion.data = data.motion.field_150.face.data; + motion.data = rob_base.robmot.field_150.face.data; } else if (value <= 0.0f) { a2 = 0; - motion.data = data.motion.field_150.face.data; + motion.data = rob_base.robmot.field_150.face.data; } else { motion.data.playback_state = ROB_PARTIAL_MOTION_PLAYBACK_STOP; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } } break; } motion.data.blend_offset = blend_offset; motion.data.blend_duration = blend_duration; - data.motion.field_150.field_1C0 = a2; + rob_base.robmot.field_150.field_1C0 = a2; sub_1405500F0(this); - data.motion.field_29 &= ~0x02; - data.motion.field_150.time = 0.0f; + rob_base.robmot.flag.u32 &= ~0x0200; + rob_base.robmot.field_150.time = 0.0f; rob_chara_set_eyelid_motion(this, &motion, 0, mot_db); } -void rob_chara::set_eyes_mottbl_motion(int32_t type, int32_t mottbl_index, +void rob_chara::set_eyes_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobEyesMotion motion; - motion.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.mottbl_index = mottbl_index; + motion.data.motnum = get_common_mot(mottbl_type); + motion.data.mottbl_type = mottbl_type; motion.data.playback_state = playback_state; motion.data.step = step; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &data.motion.frame_data; - motion.data.step_data = &data.motion.step_data; + motion.data.frame_ptr = &rob_base.robmot.frame; + motion.data.step_ptr = &rob_base.robmot.step; } motion.data.loop_state = loop_state; - if (motion.data.motion_id != -1) { - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion.data.motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + if (motion.data.motnum != -1) { + motion.data.frame_max = get_mot_frame_max(motion.data.motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } rob_chara_set_eyes_motion(this, &motion, type, mot_db); } static void sub_140553970(rob_chara* rob_chr, object_info a2, int32_t type) { if (type != 1 && type == 2) - rob_chr->data.motion.field_3B0.head_object = a2; + rob_chr->rob_base.robmot.field_3B0.head_object = a2; else - rob_chr->data.motion.field_150.head_object = a2; + rob_chr->rob_base.robmot.field_150.head_object = a2; } -void rob_chara::set_face_mottbl_motion(int32_t type, int32_t mottbl_index, +void rob_chara::set_face_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, bool a11, const motion_database* mot_db) { RobFaceMotion motion; - motion.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.mottbl_index = mottbl_index; + motion.data.motnum = get_common_mot(mottbl_type); + motion.data.mottbl_type = mottbl_type; motion.data.playback_state = playback_state; motion.data.step = step; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &data.motion.frame_data; - motion.data.step_data = &data.motion.step_data; + motion.data.frame_ptr = &rob_base.robmot.frame; + motion.data.step_ptr = &rob_base.robmot.step; } motion.data.loop_state = loop_state; - if (motion.data.motion_id != -1) { - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion.data.motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + if (motion.data.motnum != -1) { + motion.data.frame_max = get_mot_frame_max(motion.data.motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } rob_chara_set_face_motion(this, &motion, type, mot_db); int32_t head_object_id = 0; - switch (mottbl_index) { - case 0x39: // FACE_CRY / Crying (><) + switch (mottbl_type) { + case MTP_FACE_CRY: // Crying (><) head_object_id = 1; break; - case 0x3B: // FACE_CRY_OLD + case MTP_FACE_CRY_OLD: head_object_id = 7; break; - case 0x75: // FACE_RESET / Crying (><) + Shock + case MTP_FACE_RESET1: // Crying (><) + Shock head_object_id = 2; break; - case 0x77: // FACE_RESET / White-Eyed + case MTP_FACE_RESET2: // White-Eyed head_object_id = 3; break; - case 0x79: // FACE_RESET / White-Eyed + Shock + case MTP_FACE_RESET3: // White-Eyed + Shock head_object_id = 4; break; - case 0x7B: // FACE_RESET / -.- + case MTP_FACE_RESET4: // -.- head_object_id = 5; break; - case 0x7D: // FACE_RESET / -o- + case MTP_FACE_RESET5: // -o- head_object_id = 6; break; } @@ -4398,27 +4968,27 @@ void rob_chara::set_face_mottbl_motion(int32_t type, int32_t mottbl_index, } } - else if (data.motion.field_150.head_object != v17) { + else if (rob_base.robmot.field_150.head_object != v17) { sub_140553970(this, v17, type); - data.motion.field_150.eyes.data.blend_duration = 0.0f; - rob_chara_set_eyes_motion(this, &data.motion.field_150.eyes, 0, mot_db); + rob_base.robmot.field_150.eyes.data.blend_duration = 0.0f; + rob_chara_set_eyes_motion(this, &rob_base.robmot.field_150.eyes, 0, mot_db); blend_duration = 0.0f; } if (type == 1 || type != 2) { if (a11) set_eyelid_mottbl_motion_from_face(2, blend_duration, -1.0f, blend_offset, mot_db); - else if (data.motion.field_29 & 0x02) { + else if (rob_base.robmot.flag.u32 & 0x0200) { set_eyelid_mottbl_motion_from_face( - data.motion.field_150.field_1C0, 3.0f, -1.0f, 0.0f, mot_db); - data.motion.field_29 |= 0x02; + rob_base.robmot.field_150.field_1C0, 3.0f, -1.0f, 0.0f, mot_db); + rob_base.robmot.flag.u32 |= 0x0200; } else { float_t value = -1.0f; - if (data.motion.field_150.field_1C0 == 3) { - float_t frame_count = data.motion.field_150.eyelid.data.frame_count - 1.0f; - if (frame_count > 0.0f) - value = data.motion.field_150.eyelid.data.frame / frame_count; + if (rob_base.robmot.field_150.field_1C0 == 3) { + float_t frame_max = rob_base.robmot.field_150.eyelid.data.frame_max - 1.0f; + if (frame_max > 0.0f) + value = rob_base.robmot.field_150.eyelid.data.frame / frame_max; PartialMotionBlendFreeze& blend = bone_data->eyelid.blend; if (blend.duration > blend.frame) { @@ -4434,16 +5004,16 @@ void rob_chara::set_face_mottbl_motion(int32_t type, int32_t mottbl_index, _motion.data = motion.data; _motion.data.blend_duration = blend_duration; _motion.data.blend_offset = blend_offset; - data.motion.field_29 |= 0x80; + rob_base.robmot.flag.u32 |= 0x8000; rob_chara_set_eyelid_motion(this, &_motion, 2, mot_db); } } void rob_chara::set_face_object(object_info obj_info, int32_t a3) { if (a3 == 2) - data.motion.field_3B0.face_object = obj_info; + rob_base.robmot.field_3B0.face_object = obj_info; else - data.motion.field_150.face_object = obj_info; + rob_base.robmot.field_150.face_object = obj_info; } void rob_chara::set_face_object_index(int32_t index) { @@ -4452,19 +5022,19 @@ void rob_chara::set_face_object_index(int32_t index) { void rob_chara::set_frame(float_t frame) { bone_data->set_frame(frame); - data.motion.frame_data.frame = frame; + rob_base.robmot.frame.f = frame; } static void sub_140551870(rob_chara* rob_chr, float_t blend_duration, float_t blend_offset, const motion_database* aft_mot_db) { - if (!(rob_chr->data.motion.field_2A & 0x04)) + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x040000)) return; rob_chara_set_hand_l_object(rob_chr, {}, 1); - rob_chr->data.motion.field_2A &= ~0x04; + rob_chr->rob_base.robmot.flag.u32 &= ~0x040000; RobHandMotion motion; - motion.data = rob_chr->data.motion.field_150.hand_l.data; + motion.data = rob_chr->rob_base.robmot.field_150.hand_l.data; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; rob_chara_set_hand_l_motion(rob_chr, &motion, 0, aft_mot_db); @@ -4472,30 +5042,30 @@ static void sub_140551870(rob_chara* rob_chr, float_t blend_duration, static void sub_140550B90(rob_chara* rob_chr, float_t blend_duration, float_t blend_offset, const motion_database* aft_mot_db) { - rob_chr->set_hand_l_mottbl_motion(1, 192, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_hand_l_mottbl_motion(1, MTP_HAND_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); sub_140551870(rob_chr, blend_duration, blend_offset, aft_mot_db); } -static void sub_140554690(rob_chara* rob_chr, int32_t mottbl_index, +static void sub_140554690(rob_chara* rob_chr, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* aft_mot_db) { - rob_chr->data.motion.field_2A |= 0x04; - rob_chr->set_hand_l_mottbl_motion(1, mottbl_index, value, playback_state, + rob_chr->rob_base.robmot.flag.u32 |= 0x040000; + rob_chr->set_hand_l_mottbl_motion(1, mottbl_type, value, playback_state, blend_duration, play_duration, step, loop_state, blend_offset, aft_mot_db); } static void sub_1405519B0(rob_chara* rob_chr, float_t blend_duration, float_t blend_offset, const motion_database* aft_mot_db) { - if (!(rob_chr->data.motion.field_2A & 0x08)) + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x080000)) return; rob_chara_set_hand_r_object(rob_chr, {}, 1); - rob_chr->data.motion.field_2A &= ~0x08; + rob_chr->rob_base.robmot.flag.u32 &= ~0x080000; RobHandMotion motion; - motion.data = rob_chr->data.motion.field_150.hand_r.data; + motion.data = rob_chr->rob_base.robmot.field_150.hand_r.data; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; rob_chara_set_hand_r_motion(rob_chr, &motion, 0, aft_mot_db); @@ -4503,15 +5073,15 @@ static void sub_1405519B0(rob_chara* rob_chr, float_t blend_duration, static void sub_140550C10(rob_chara* rob_chr, float_t blend_duration, float_t blend_offset, const motion_database* aft_mot_db) { - rob_chr->set_hand_r_mottbl_motion(1, 192, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_hand_r_mottbl_motion(1, MTP_HAND_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); sub_1405519B0(rob_chr, blend_duration, blend_offset, aft_mot_db); } -static void sub_140554710(rob_chara* rob_chr, int32_t mottbl_index, float_t value, +static void sub_140554710(rob_chara* rob_chr, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* aft_mot_db) { - rob_chr->data.motion.field_2A |= 0x08; - rob_chr->set_hand_r_mottbl_motion(1, mottbl_index, value, playback_state, + rob_chr->rob_base.robmot.flag.u32 |= 0x080000; + rob_chr->set_hand_r_mottbl_motion(1, mottbl_type, value, playback_state, blend_duration, play_duration, step, loop_state, blend_offset, aft_mot_db); } @@ -4519,7 +5089,7 @@ void rob_chara::set_hand_item(int32_t uid, float_t blend_duration) { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - int32_t mottbl_index = 192; + MOTTABLE_TYPE mottbl_type = MTP_HAND_NULL; object_info obj_left = {}; object_info obj_right = {}; float_t left_hand_scale = -1.0f; @@ -4528,22 +5098,22 @@ void rob_chara::set_hand_item(int32_t uid, float_t blend_duration) { const hand_item* hand_item = hand_item_handler_data_get_hand_item(uid, chara_num); if (hand_item) { if (hand_item->obj_left.not_null()) { - left_hand_scale = hand_item->hand_scale; + left_hand_scale = hand_item->scale; obj_left = hand_item->obj_left; } if (hand_item->obj_right.not_null()) { - right_hand_scale = hand_item->hand_scale; + right_hand_scale = hand_item->scale; obj_right = hand_item->obj_right; } - mottbl_index = hand_item->hand_mottbl_index; + mottbl_type = (MOTTABLE_TYPE)hand_item->mottbl_type; } if (obj_left.is_null()) sub_140550B90(this, blend_duration, 0.0f, aft_mot_db); else { - sub_140554690(this, mottbl_index, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, + sub_140554690(this, mottbl_type, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); rob_chara_set_hand_l_object(this, obj_left, 1); } @@ -4551,13 +5121,13 @@ void rob_chara::set_hand_item(int32_t uid, float_t blend_duration) { if (obj_right.is_null()) sub_140550C10(this, blend_duration, 0.0f, aft_mot_db); else { - sub_140554710(this, mottbl_index, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, + sub_140554710(this, mottbl_type, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); rob_chara_set_hand_r_object(this, obj_right, 1); } - data.adjust_data.left_hand_scale_default = left_hand_scale; - data.adjust_data.right_hand_scale_default = right_hand_scale; + rob_base.adjust.left_hand_scale_default = left_hand_scale; + rob_base.adjust.right_hand_scale_default = right_hand_scale; } void rob_chara::set_hand_item_l(int32_t uid) { @@ -4577,55 +5147,55 @@ void rob_chara::set_hand_item_r(int32_t uid) { } void rob_chara::set_hand_l_mottbl_motion(int32_t type, - int32_t mottbl_index, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, + MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobHandMotion motion; - motion.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.mottbl_index = mottbl_index; + motion.data.motnum = get_common_mot(mottbl_type); + motion.data.mottbl_type = mottbl_type; motion.data.playback_state = playback_state; motion.data.step = step; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &data.motion.frame_data; - motion.data.step_data = &data.motion.step_data; + motion.data.frame_ptr = &rob_base.robmot.frame; + motion.data.step_ptr = &rob_base.robmot.step; } motion.data.loop_state = loop_state; - if (motion.data.motion_id != -1) { - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion.data.motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + if (motion.data.motnum != -1) { + motion.data.frame_max = get_mot_frame_max(motion.data.motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } rob_chara_set_hand_l_motion(this, &motion, type, mot_db); } void rob_chara::set_hand_r_mottbl_motion(int32_t type, - int32_t mottbl_index, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, + MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobHandMotion motion; - motion.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.mottbl_index = mottbl_index; + motion.data.motnum = get_common_mot(mottbl_type); + motion.data.mottbl_type = mottbl_type; motion.data.playback_state = playback_state; motion.data.step = step; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &data.motion.frame_data; - motion.data.step_data = &data.motion.step_data; + motion.data.frame_ptr = &rob_base.robmot.frame; + motion.data.step_ptr = &rob_base.robmot.step; } motion.data.loop_state = loop_state; - if (motion.data.motion_id != -1) { - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion.data.motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + if (motion.data.motnum != -1) { + motion.data.frame_max = get_mot_frame_max(motion.data.motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } rob_chara_set_hand_r_motion(this, &motion, type, mot_db); } void rob_chara::set_left_hand_scale(float_t value) { - data.adjust_data.left_hand_scale = value; + rob_base.adjust.left_hand_scale = value; } void rob_chara::set_look_camera(bool update_view_point, bool rotation_enable, float_t head_rot_strength, @@ -4633,7 +5203,7 @@ void rob_chara::set_look_camera(bool update_view_point, bool rotation_enable, fl bone_data->set_look_anim(update_view_point, rotation_enable, head_rot_strength, eyes_rot_strength, blend_duration, eyes_rot_step, a8, ft); if (fabsf(blend_duration) <= 0.000001f) - data.flag.bit.dmy_yokerare = 1; + rob_base.flag.bit.dmy_yokerare = 1; } void rob_chara::set_look_camera_new(bool rotation_enable, float_t head_rot_strength, @@ -4648,128 +5218,242 @@ void rob_chara::set_look_camera_old(bool rotation_enable, float_t head_rot_stren eyes_rot_strength, blend_duration, eyes_rot_step, a8, false); } -bool rob_chara::set_motion_id(uint32_t motion_id, - float_t frame, float_t blend_duration, bool blend, bool set_motion_reset_data, - MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db) { - if (!blend && data.motion.motion_id == motion_id) - return false; - - if (blend_duration <= 0.0f) - blend_type = MOTION_BLEND; - load_motion(motion_id, false, frame, blend_type, bone_data, mot_db); - this->bone_data->set_motion_blend_duration(blend_duration, 1.0f, 0.0f); - data.motion.field_28 |= 0x80; - data.motion.frame_data.last_set_frame = frame; - set_motion_skin_param(motion_id, (float_t)(int32_t)frame); - if (blend_duration == 0.0f) { - if (set_motion_reset_data) - rob_chara::set_motion_reset_data(motion_id, frame); - - rob_disp->skin_disp[RPK_TE_L].init_cnt = 60; - rob_disp->skin_disp[RPK_TE_R].init_cnt = 60; - - if (check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(chara_id, 1); - rob_chara_age_age_array_set_skip(chara_id, 2); - } - } - return true; -} - void rob_chara::set_motion_loop(float_t loop_begin, float_t loop_end, int32_t loop_count) { bone_data->set_motion_loop_state(MOT_PLAY_FRAME_DATA_LOOP_CONTINUOUS); bone_data->set_motion_loop(loop_begin, loop_count, loop_end); - if (data.motdata.field_0.field_58 != 1) { - data.motdata.field_0.field_58 = 1; - data.motdata.field_0.frame = data.motdata.field_0.frame_count - 1.0f; + if (rob_base.motdata.next_type != MH_NEXT_REPEAT) { + rob_base.motdata.next_type = MH_NEXT_REPEAT; + rob_base.motdata.frame = rob_base.motdata.frame_max - 1.0f; } } -void rob_chara::set_motion_reset_data(uint32_t motion_id, float_t frame) { - rob_disp->set_motion_reset_data(motion_id, frame); +void rob_chara::set_motion_reset_data(const uint32_t& motnum, const float_t& frame) { + disp->set_motion_reset_data(motnum, frame); } -void rob_chara::set_motion_skin_param(uint32_t motion_id, float_t frame) { - rob_disp->set_motion_skin_param(chara_id, motion_id, (int32_t)prj::roundf(frame)); +void rob_chara::set_motion_skin_param(const uint32_t& motnum, const float_t& frame) { + disp->set_motion_skin_param(idnm, motnum, (int32_t)prj::roundf(frame)); } void rob_chara::set_motion_step(float_t value) { - data.motion.step_data.step = value; + rob_base.robmot.step.req_f = value; } void rob_chara::set_mouth_mottbl_motion(int32_t type, - int32_t mottbl_index, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, + MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobMouthMotion motion; - motion.data.motion_id = get_rob_cmn_mottbl_motion_id(mottbl_index); - motion.data.mottbl_index = mottbl_index; + motion.data.motnum = get_common_mot(mottbl_type); + motion.data.mottbl_type = mottbl_type; motion.data.playback_state = playback_state; motion.data.step = step; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &data.motion.frame_data; - motion.data.step_data = &data.motion.step_data; + motion.data.frame_ptr = &rob_base.robmot.frame; + motion.data.step_ptr = &rob_base.robmot.step; } motion.data.loop_state = loop_state; - if (motion.data.motion_id != -1) { - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion.data.motion_id, mot_db); - motion.data.frame = (motion.data.frame_count - 1.0f) * value; + if (motion.data.motnum != -1) { + motion.data.frame_max = get_mot_frame_max(motion.data.motnum, mot_db); + motion.data.frame = (motion.data.frame_max - 1.0f) * value; } rob_chara_set_mouth_motion(this, &motion, type, mot_db); } void rob_chara::set_osage_move_cancel(uint8_t id, float_t mv_ccl) { - rob_disp->set_osage_move_cancel(id, mv_ccl); + disp->set_osage_move_cancel(id, mv_ccl); if (id < 2) { - rob_chara_age_age_array_set_move_cancel(chara_id, 1, mv_ccl); - rob_chara_age_age_array_set_move_cancel(chara_id, 2, mv_ccl); + rob_chara_age_age_array_set_move_cancel(idnm, 1, mv_ccl); + rob_chara_age_age_array_set_move_cancel(idnm, 2, mv_ccl); } } void rob_chara::set_osage_reset() { - rob_disp->set_osage_reset(); + disp->set_osage_reset(); } void rob_chara::set_osage_step(float_t value) { - data.motion.step = value; + rob_base.robmot.osage_step = value; if (value < 0.0f) - value = data.motion.step_data.frame; - rob_disp->set_osage_step(value); + value = rob_base.robmot.step.f; + disp->set_osage_step(value); } -void rob_chara::set_parts_disp(ROB_PARTS_KIND rpk, bool disp) { +void rob_chara::set_parts_disp(ROB_PARTS_KIND rpk, bool flag) { if (rpk < 0) return; else if (rpk < RPK_MAX) - rob_disp->set_disp(rpk, disp); + disp->set_disp_flag(rpk, flag); else if (rpk == RPK_MAX) for (int32_t i = RPK_DISP_BEGIN; i <= RPK_DISP_END; i++) { - rob_disp->set_disp((ROB_PARTS_KIND)i, disp); + disp->set_disp_flag((ROB_PARTS_KIND)i, flag); if (i == RPK_ATAMA && check_for_ageageagain_module()) { - rob_chara_age_age_array_set_disp(chara_id, 1, disp); - rob_chara_age_age_array_set_disp(chara_id, 2, disp); - rob_chara_age_age_array_set_skip(chara_id, 1); - rob_chara_age_age_array_set_skip(chara_id, 2); + rob_chara_age_age_array_set_disp(idnm, 1, flag); + rob_chara_age_age_array_set_disp(idnm, 2, flag); + rob_chara_age_age_array_set_skip(idnm, 1); + rob_chara_age_age_array_set_skip(idnm, 2); } } } void rob_chara::set_right_hand_scale(float_t value) { - data.adjust_data.right_hand_scale = value; + rob_base.adjust.right_hand_scale = value; +} + +void rob_chara::set_rob_motion(uint32_t motnum, bool mirror, float_t frame, + MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db) { + rob_base.position.yang = calc_mot_yang(false); + if (!rob_base.motdata.motkind[MK_NO_MOVE]) { + rob_base.position.pos.x = rob_base.position.gpos.x; + rob_base.position.pos.z = rob_base.position.gpos.z; + } + + if (rob_base.motdata.motkind[MK_Y_MOVE]) + rob_base.position.pos.y = rob_base.position.gpos.y; + + if (mirror) + rob_base.robmot.flag.bit.next_mirror ^= true; + + if (rob_base.robmot.flag.bit.next_mirror) + rob_base.robmot.flag.bit.mirror = true; + else + rob_base.robmot.flag.bit.mirror = false; + + rob_base.robmot.flag.bit.change = true; + rob_base.robmot.flag.bit.frame_ctrl = false; + rob_base.robmot.flag.bit.ext_frame_req = false; + + rob_base.robmot.repeat_count = 0; + rob_base.robmot.shift_req.reset(); + + rob_chara_data_adjust* parts_adjust = rob_base.robmot.parts_adjust; + for (int32_t i = 0; i < ROB_OSAGE_PARTS_MAX; i++, parts_adjust++) + parts_adjust->reset(); + + rob_base.robmot.adjust_global.reset(); + + rob_base.adjust.offset = 0.0f; + rob_base.adjust.offset_x = true; + rob_base.adjust.offset_y = false; + rob_base.adjust.offset_z = true; + rob_base.adjust.get_global_pos = false; + + rob_chara_data_arm_adjust* arm_adjust = rob_base.robmot.arm_adjust; + rob_chara_data_hand_adjust* hand_adjust = rob_base.robmot.hand_adjust; + rob_chara_data_hand_adjust* hand_adjust_prev = rob_base.robmot.hand_adjust_prev; + for (int32_t i = 0; i < 2; i++, arm_adjust++, hand_adjust++, hand_adjust_prev++) { + hand_adjust->reset(); + hand_adjust_prev->reset(); + arm_adjust->reset(); + rob_chara_bone_data_set_motion_arm_length(this->bone_data, get_lc_arm_block(i), 0.0f); + } + this->bone_data->set_disable_eye_motion(false); + + disp->set_osage_move_cancel(0, 0.0f); + for (int32_t i = 0; i < ROB_OSAGE_PARTS_MAX; i++) + disp->set_disable_collision((rob_osage_parts)i, false); + + rob_base.motdata.old_motkind_fix = rob_base.motdata.motkind_fix; + rob_base.motdata.old_motkind = rob_base.motdata.motkind; + rob_base.motdata.old_mov_yang = rob_base.motdata.mov_yang; + rob_base.motdata.clear(); + + sub_14053A9C0(&rob_base.motdata, this, motnum, + get_mot_frame_max(motnum, mot_db), mot_db); + + if (rob_base.motdata.old_motkind[MK_NEXT_TRANS]) + rob_base.motdata.motkind.set(MK_NO_TRANS); + if (rob_base.motdata.old_motkind[MK_NEXT_Y_TRANS]) + rob_base.motdata.motkind.set(MK_Y_TRANS); + + if (!rob_base.motdata.motkind[MK_NO_MOVE] && frame > 0.0f) + rob_base.motdata.motkind.set(MK_NO_TRANS); + + rob_base.robmot.old_num = rob_base.robmot.num; + rob_base.robmot.frame.f = frame; + rob_base.robmot.basic_step = BSTEP_BEGIN; + rob_base.robmot.num = motnum; + if (rob_base.robmot.step.req_f < 0.0f) + rob_base.robmot.step.f = 1.0f; + else + rob_base.robmot.step.f = rob_base.robmot.step.req_f; + + float_t osage_step = rob_base.robmot.osage_step; + if (osage_step < 0.0f) + osage_step = rob_base.robmot.step.f; + disp->set_osage_step(osage_step); + + rob_chara_bone_data_motion_load(this->bone_data, motnum, blend_type, bone_data, mot_db); + this->bone_data->set_motion_frame(rob_base.robmot.step.f, + rob_base.robmot.step.f, rob_base.motdata.frame_max); + this->bone_data->set_motion_playback_state(MOT_PLAY_FRAME_DATA_PLAYBACK_FORWARD); + if (rob_base.motdata.next_type == MH_NEXT_REPEAT) { + this->bone_data->set_motion_loop_state(MOT_PLAY_FRAME_DATA_LOOP_CONTINUOUS); + this->bone_data->set_motion_loop(rob_base.motdata.loop_begin, + rob_base.motdata.next_limit, -1.0f); + } + rob_chara_bone_data_set_yrot(this->bone_data, rob_base.motdata.dturn_yang.get_rad()); + sub_14041BC40(this->bone_data, rob_base.motdata.motkind[MK_DMIRROR]); + sub_14041B9D0(this->bone_data); + if (type == ROB_TYPE_AUTH) { + sub_14041D340(this->bone_data, !!(rob_base.motdata.end_style_flag & 0x40)); + sub_14041D6C0(this->bone_data, rob_base.motdata.old_motkind[MK_NO_MOVE] + && rob_base.motdata.motkind[MK_NO_TRANS]); + sub_14041D6F0(this->bone_data, rob_base.motdata.motkind_fix[MK_Y_TRANS] + || rob_base.motdata.motkind_fix[MK_Y_MOVE]); + sub_14041D720(this->bone_data, rob_base.motdata.motkind_fix[MK_Y_TRANS] + || rob_base.motdata.motkind_fix[MK_Y_MOVE]); + sub_14041D2A0(this->bone_data, rob_base.motdata.old_mov_yang.get_rad()); + sub_14041D270(this->bone_data, rob_base.motdata.mov_yang.get_rad()); + } + else + sub_140555B00(this, blend_type >= MOTION_BLEND_FREEZE && blend_type <= MOTION_BLEND_CROSS); + rob_base.sound.blow_flag = false; +} + +// 0x140516890 +void rob_chara::set_rob_motion_external(uint32_t motnum) { + if (rob_base.flag.bit.disp) + set_rob_sys_command(ROB_ACT_MOTION, motnum, 0, false); +} + +// 0x1405168C0 +void rob_chara::set_rob_pos(const vec3& pos) { + rob_base.position.pos = pos; +} + +// 0x140555960 +void rob_chara::set_rob_sys_command(ACT_NAME name, int32_t motion_id, const ActParam* param, bool mirror) { + RobActType& sys_command = rob_base.action.sys_command; + sys_command.name = name; + if (param) { + sys_command.act_param = *param; + sys_command.motnum = motion_id; + sys_command.mirror = mirror; + } + else { + sys_command.act_param.init(); + sys_command.motnum = motion_id; + sys_command.mirror = mirror; + } +} + +// 0x1405168E0 +void rob_chara::set_rob_yang(const RobAngle& ang) { + rob_base.position.yang = ang; } void rob_chara::set_shadow_cast(bool value) { if (value) - rob_disp->shadow_flag |= 0x04; + disp->shadow_flag |= 0x04; else - rob_disp->shadow_flag &= ~0x04; + disp->shadow_flag &= ~0x04; } -static void rob_chara_item_equip_object_set_ring( - rob_chara_item_equip_object* skin_disp, const osage_ring_data& ring) { +static void RobSkinDisp_set_ring(RobSkinDisp* skin_disp, const osage_ring_data& ring) { for (ExOsageBlock*& i : skin_disp->osage_blk) i->SetRing(ring); @@ -4777,55 +5461,39 @@ static void rob_chara_item_equip_object_set_ring( i->SetRing(ring); } -static void rob_chara_item_equip_set_ring(rob_chara_item_equip* rob_disp, const osage_ring_data& ring) { - for (int32_t i = rob_disp->disp_begin; i < rob_disp->disp_max; i++) - rob_chara_item_equip_object_set_ring(&rob_disp->skin_disp[i], ring); +static void RobDisp_set_ring(RobDisp* disp, const osage_ring_data& ring) { + for (int32_t i = disp->disp_begin; i < disp->disp_max; i++) + RobSkinDisp_set_ring(&disp->skin_disp[i], ring); } void rob_chara::set_stage_data_ring(const int32_t& stage_index) { osage_ring_data ring; if (stage_index != -1) stage_param_data_coli_data_get_stage_index_data(stage_index, &ring); - rob_chara_item_equip_set_ring(rob_disp, ring); + RobDisp_set_ring(disp, ring); } void rob_chara::set_step_motion_step(float_t value) { - data.motion.step_data.step = value; + rob_base.robmot.step.req_f = value; if (value < 0.0f) - data.motion.step_data.frame = 1.0f; + rob_base.robmot.step.f = 1.0f; else - data.motion.step_data.frame = value; + rob_base.robmot.step.f = value; - rob_chara_bone_data_set_step(bone_data, data.motion.step_data.frame); + rob_chara_bone_data_set_step(bone_data, rob_base.robmot.step.f); - float_t step = data.motion.step; - if (step < 0.0f) - step = data.motion.step_data.frame; - rob_disp->set_osage_step(step); + float_t osage_step = rob_base.robmot.osage_step; + if (osage_step < 0.0f) + osage_step = rob_base.robmot.step.f; + disp->set_osage_step(osage_step); } void rob_chara::set_use_opd(bool value) { - rob_disp->use_opd = value; -} - -void rob_chara::set_visibility(bool value) { - if (value) { - data.flag.bit.disp = 1; - data.flag.bit.yoketa = 1; - } - else { - data.flag.bit.disp = 0; - data.flag.bit.yoketa = 0; - } - - if (check_for_ageageagain_module()) { - rob_chara_age_age_array_set_disp(chara_id, 1, value); - rob_chara_age_age_array_set_disp(chara_id, 2, value); - } + disp->use_opd = value; } void rob_chara::set_wind_strength(float_t value) { - rob_disp->wind_strength = value; + disp->wind_strength = value; } static bool sub_140413710(mot_play_data* play_data) { @@ -4847,238 +5515,201 @@ static bool sub_140419E90(rob_chara_bone_data* rob_bone_data) { } static void sub_140505310(rob_chara* rob_chr, const bone_database* bone_data, const motion_database* mot_db) { - switch (rob_chr->data.motdata.field_0.field_58) { - case -1: { - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x81; - rob_chr->data.motion.frame_data.frame = rob_chr->data.motdata.field_0.frame; + switch (rob_chr->rob_base.motdata.next_type) { + case MH_NEXT_NONE: { + rob_chr->rob_base.motdata.motkind.reset(MK_CHANGE); + rob_chr->rob_base.motdata.motkind.reset(MK_JUMP); + rob_chr->rob_base.robmot.frame.f = rob_chr->rob_base.motdata.frame; } break; - case 0: { - uint32_t motion_id = rob_chr->data.motdata.field_0.field_5C; - if (motion_id == -1) - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x81; + case MH_NEXT_MOTION: { + uint32_t mot_id = rob_chr->rob_base.motdata.next.mot_id; + if (mot_id == -1) { + rob_chr->rob_base.motdata.motkind.reset(MK_CHANGE); + rob_chr->rob_base.motdata.motkind.reset(MK_JUMP); + } else - rob_chr->load_motion(motion_id, !!(rob_chr->data.motdata.field_0.field_60 & 0x01), + rob_chr->set_rob_motion(mot_id, !!(rob_chr->rob_base.motdata.next.mot_flag & 0x01), 0.0f, MOTION_BLEND, bone_data, mot_db); } break; - case 1: { - struc_223* v1 = &rob_chr->data.motdata; - int32_t loop_count = rob_chr->data.motdata.field_0.loop_count; - if (loop_count > 0) { - uint32_t motion_id = rob_chr->data.motdata.field_0.field_64; - if (motion_id != -1) { - if (rob_chr->data.motion.loop_index >= loop_count) { - int32_t v6 = mothead_storage_get_mot_by_motion_id(motion_id, mot_db)->field_0.field_0; - if (!(v6 & 0x80000) && !(v6 & 0x100000)) - rob_chr->load_motion(motion_id, !!(rob_chr->data.motdata.field_0.field_68 & 0x01), + case MH_NEXT_REPEAT: { + RobMotData& motdata = rob_chr->rob_base.motdata; + int32_t next_limit = rob_chr->rob_base.motdata.next_limit; + if (next_limit > 0) { + uint32_t mot_id = rob_chr->rob_base.motdata.next_end.mot_id; + if (mot_id != -1) { + if (rob_chr->rob_base.robmot.repeat_count >= next_limit) { + prj::BitArray<127> v6(mothead_storage_get_mot_by_motion_id(mot_id, mot_db)->mot_kind.mhk_kind); + if (!v6[MK_NAGE] && !v6[MK_NAGERARE]) + rob_chr->set_rob_motion(mot_id, !!(rob_chr->rob_base.motdata.next_end.mot_flag & 0x01), 0.0f, MOTION_BLEND, bone_data, mot_db); } - else if (v1->field_0.field_20.field_0 & 0x80000) { - int16_t* v8 = (int16_t*)rob_chr->data.action.field_148; - rob_chr->data.action.field_146 = v1->field_0.field_220; - if (v8) - v8[711] = v1->field_0.field_220; + else if (motdata.motkind[MK_NAGE]) { + rob_chara* enemy = rob_chr->rob_base.action.nage.enemy; + rob_chr->rob_base.action.nage.kaeshi_damage = motdata.nage_damage; + if (enemy) + enemy->rob_base.action.nage.kaeshi_damage = motdata.nage_damage; } - else if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x100000) - rob_chr->data.action.field_0 = 1; + else if (rob_chr->rob_base.motdata.motkind[MK_NAGERARE]) + rob_chr->rob_base.action.step = 1; } } - rob_chr->data.motion.frame_data.frame = rob_chr->bone_data->get_frame(); - v1->field_330.field_0.current = v1->field_330.field_0.data; - rob_chr->data.motion.loop_index++; + rob_chr->rob_base.robmot.frame.f = rob_chr->bone_data->get_frame(); + motdata.play_prog = motdata.play_prog_org; + rob_chr->rob_base.robmot.repeat_count++; return; } break; - case 2: - case 3: - case 5: { - rob_chr->load_motion(rob_chr->get_rob_cmn_mottbl_motion_id(0), + case MH_NEXT_KAMAE: + case MH_NEXT_MAKE: + case MH_NEXT_DOWN_POSE: { + rob_chr->set_rob_motion(rob_chr->get_common_mot(MTP_NONE), false, 0.0f, MOTION_BLEND, bone_data, mot_db); } break; } } static void sub_140505980(rob_chara* rob_chr) { - int32_t v3; - int32_t v4; - if (rob_chr->data.motion.field_24) { - if (rob_chr->data.motion.field_24 != 1) { - if (rob_chr->data.motion.field_24 != 2) + if (rob_chr->rob_base.robmot.basic_step) { + if (rob_chr->rob_base.robmot.basic_step != BSTEP_MAIN) { + if (rob_chr->rob_base.robmot.basic_step != BSTEP_FOLLOW1) return; goto LABEL_23; } } else { - if (rob_chr->data.motdata.field_0.field_78 > rob_chr->data.motion.frame_data.frame) + if (rob_chr->rob_base.motdata.main_mot_frame > rob_chr->rob_base.robmot.frame.f) return; - if (rob_chr->data.motdata.field_0.field_10.field_0 & 0x4000) { - rob_chr->data.motdata.field_0.field_20.field_0 |= 0x4000; - if ((rob_chr->data.motdata.field_0.field_10.field_0 & 0x20000) != 0) - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x20000; + if (rob_chr->rob_base.motdata.motkind_fix[MK_ATTACK] ) { + rob_chr->rob_base.motdata.motkind.set(MK_ATTACK); + if (rob_chr->rob_base.motdata.motkind_fix[MK_RISE]) + rob_chr->rob_base.motdata.motkind.reset(MK_RISE); } - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x02; - rob_chr->data.motion.field_24 = 1; + rob_chr->rob_base.motdata.motkind.reset(MK_BEGIN); + rob_chr->rob_base.robmot.basic_step = BSTEP_MAIN; } - if (rob_chr->data.motdata.field_0.field_7C > rob_chr->data.motion.frame_data.frame) + if (rob_chr->rob_base.motdata.follow1_frame > rob_chr->rob_base.robmot.frame.f) return; - rob_chr->data.motdata.field_0.field_20.field_0 |= 4; - rob_chr->data.motdata.field_0.field_20.field_8 &= ~0x400000; - v3 = rob_chr->data.motdata.field_0.field_20.field_0; - if (v3 & 0x4000) { - rob_chr->data.motdata.field_0.field_20.field_0 = v3 & ~0x4000; - rob_chr->data.motdata.field_0.field_88 &= ~0x02; - if (rob_chr->data.motdata.field_0.field_88 & 0x04) - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x8000; + rob_chr->rob_base.motdata.motkind.set(MK_FOLLOW); + rob_chr->rob_base.motdata.motkind.reset(MK_ATTACK_FOLLOW); + if (rob_chr->rob_base.motdata.motkind[MK_ATTACK]) { + rob_chr->rob_base.motdata.motkind.reset(MK_ATTACK); + rob_chr->rob_base.motdata.attack_kind.reset(ATK_HIT_OK); + if (rob_chr->rob_base.motdata.attack_kind[ATK_GUARD]) + rob_chr->rob_base.motdata.motkind.reset(MK_GUARD); } - else if (v3 & 0x2000000 - && (v3 & 0x01) != 0 - && !(rob_chr->data.motdata.field_0.field_20.field_4 & 0x10000000) - && !(rob_chr->data.motdata.field_0.field_20.field_4 & 0x20000000)) - rob_chr->data.motdata.field_0.field_20.field_0 = v3 & ~0x01; + else if (rob_chr->rob_base.motdata.motkind[MK_YOKE] + && rob_chr->rob_base.motdata.motkind[MK_CHANGE] + && !rob_chr->rob_base.motdata.motkind[MK_YOKE_R] + && !rob_chr->rob_base.motdata.motkind[MK_YOKE_L]) + rob_chr->rob_base.motdata.motkind.reset(MK_CHANGE); - v4 = rob_chr->data.motdata.field_0.field_10.field_0; - if (v4 & 0x10000 && v4 & 0x20000) - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x20000; - rob_chr->data.motion.field_24 = 2; + if (rob_chr->rob_base.motdata.motkind_fix[MK_UKEMI] + && rob_chr->rob_base.motdata.motkind_fix[MK_RISE]) + rob_chr->rob_base.motdata.motkind.reset(MK_RISE); + rob_chr->rob_base.robmot.basic_step = BSTEP_FOLLOW1; LABEL_23: - float_t v5 = rob_chr->data.motdata.field_0.field_80; - if (v5 >= 0.0f && v5 <= rob_chr->data.motion.frame_data.frame) { - if (v5 < (rob_chr->data.motdata.field_0.frame - 1.0f) - || rob_chr->data.motdata.field_0.field_58 == -1 - || rob_chr->data.motdata.field_0.field_58 == 2) { - rob_chr->data.motdata.field_0.field_20.field_0 &= ~0x2020081; - rob_chr->data.flag.bit.mk_change_off = 1; + float_t follow2_frame = rob_chr->rob_base.motdata.follow2_frame; + if (follow2_frame >= 0.0f && follow2_frame <= rob_chr->rob_base.robmot.frame.f) { + if (follow2_frame < (rob_chr->rob_base.motdata.frame - 1.0f) + || rob_chr->rob_base.motdata.next_type == MH_NEXT_NONE + || rob_chr->rob_base.motdata.next_type == MH_NEXT_KAMAE) { + rob_chr->rob_base.motdata.motkind.reset(MK_CHANGE); + rob_chr->rob_base.motdata.motkind.reset(MK_JUMP); + rob_chr->rob_base.motdata.motkind.reset(MK_RISE); + rob_chr->rob_base.motdata.motkind.reset(MK_YOKE); + rob_chr->rob_base.flag.bit.mk_change_off = true; } - rob_chr->data.motion.field_24 = 3; + rob_chr->rob_base.robmot.basic_step = BSTEP_FOLLOW2; } } -// 0x1405333E0 -static void mothead_apply_inner(mothead_func_data* func_data, - int32_t func_id, const struc_377& a3, int32_t frame, const motion_database* mot_db) { - if (func_id < 0 || func_id >= MOTHEAD_DATA_MAX || !mothead_func_array[func_id].func) - return; - - if (!(mothead_func_array[func_id].flags & 0x01) || frame <= 0) - mothead_func_array[func_id].func(func_data, a3.current->data, a3.current, frame, mot_db); - else { - frame -= a3.current->frame; - if (frame <= 1) - mothead_func_array[func_id].func(func_data, a3.current->data, a3.current, frame, mot_db); - } -} - -// 0x1405338F0 -static void mothead_apply(struc_223* a1, rob_chara* rob_chr, float_t frame, const motion_database* mot_db) { - a1->field_330.field_338 = 0; - - struc_377& v4 = a1->field_330.field_0; - if (!v4.current) - return; - - mothead_func_data func_data; - func_data.rob_chr = rob_chr; - func_data.rob_base = &rob_chr->data; - if (rob_chr->field_20) - func_data.field_10 = (rob_chara_data*)((size_t)rob_chr->field_20 + 0x440); - else - func_data.field_10 = 0; - func_data.field_18 = rob_chr; - func_data.field_28 = &rob_chr->data.motdata; - func_data.field_20 = &rob_chr->data; - - int32_t frame_int = (int32_t)frame; - while (v4.current->frame <= frame_int && v4.current->type >= MOTHEAD_DATA_TYPE_0) { - mothead_apply_inner(&func_data, v4.current->type, v4, frame_int, mot_db); - v4.current++; - } -} - -static void sub_1405044B0(rob_chara* rob_chr) { - if (rob_chr->data.motdata.field_330.arm_adjust_duration > 0) { // X +// 0x1405044B0 +void rob_chara::calc_mot_adjust_scale() { + if (rob_base.motdata.arm_adjust_duration > 0) { // X float_t blend = 1.0f; - if (fabsf(rob_chr->data.motdata.field_330.arm_adjust_duration) > 0.000001f) - blend = (rob_chr->data.motion.frame_data.frame - - (float_t)rob_chr->data.motdata.field_330.arm_adjust_start_frame) - / rob_chr->data.motdata.field_330.arm_adjust_duration; + if (fabsf(rob_base.motdata.arm_adjust_duration) > 0.000001f) + blend = (rob_base.robmot.frame.f + - (float_t)rob_base.motdata.arm_adjust_start_frame) + / rob_base.motdata.arm_adjust_duration; blend = clamp_def(blend, 0.0f, 1.0f); if (fabsf(blend - 1.0f) <= 0.000001f) - rob_chr->data.motdata.field_330.arm_adjust_duration = -1.0f; - rob_chr->data.arm_adjust_scale = lerp_def(rob_chr->data.motdata.field_330.arm_adjust_prev_value, - rob_chr->data.motdata.field_330.arm_adjust_next_value, blend); + rob_base.motdata.arm_adjust_duration = -1.0f; + rob_base.arm_adjust_scale = lerp_def(rob_base.motdata.arm_adjust_prev_value, + rob_base.motdata.arm_adjust_next_value, blend); float_t default_scale = chara_size_table_get_value(1); - rob_chr->data.adjust_data.item_scale = default_scale - + (rob_chr->data.adjust_data.scale - default_scale) * rob_chr->data.arm_adjust_scale; + rob_base.adjust.item_scale = default_scale + + (rob_base.adjust.scale - default_scale) * rob_base.arm_adjust_scale; } - float_t v2 = rob_chr->bone_data->ik_scale.ratio0; + float_t v2 = bone_data->adjust_scale.base; float_t v4 = v2; - if (!rob_chr->data.motdata.field_330.field_31C) { - rob_chr->data.motion.field_138 = v2; - rob_chr->data.motion.field_13C = v2; - rob_chr->data.motion.field_140 = 0.0f; + if (rob_base.motdata.mot_adjust_type == MA_TYPE_NONE) { + rob_base.robmot.mot_adjust_scale = v2; + rob_base.robmot.mot_xz_adjust_scale = v2; + rob_base.robmot.mot_adjust_base_pos = 0.0f; return; } - float_t v5 = rob_chr->data.motdata.field_330.field_324; + float_t v5 = rob_base.motdata.pre_adjust_scale; float_t v6 = v2; - float_t v7 = rob_chr->data.motdata.field_330.field_32C; + float_t v7 = rob_base.motdata.pre_adjust_base_ypos; float_t v8 = 0.0f; - if (rob_chr->data.motdata.field_330.field_318 == 1) { - switch (rob_chr->data.motdata.field_330.field_31C) { - case 1: + if (rob_base.motdata.mot_adjust_flag == 1) { + switch (rob_base.motdata.mot_adjust_type) { + case MA_TYPE_COMMON: v6 = 1.0f; break; - case 2: - v6 = rob_chr->bone_data->ik_scale.ratio0; - case 3: - v6 = rob_chr->bone_data->ik_scale.ratio1; - case 4: - v6 = rob_chr->bone_data->ik_scale.ratio2; - case 5: - v6 = rob_chr->bone_data->ik_scale.ratio3; - case 6: - if (!rob_chr->field_20) + case MA_TYPE_SCALE: + v6 = bone_data->adjust_scale.base; + case MA_TYPE_BODY: + v6 = bone_data->adjust_scale.body; + case MA_TYPE_ARM: + v6 = bone_data->adjust_scale.arm; + case MA_TYPE_HEIGHT: + v6 = bone_data->adjust_scale.height; + case MA_TYPE_EMY_SCALE: + if (!enemy) break; - v6 = rob_chr->field_20->bone_data->ik_scale.ratio0; - if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 = enemy->bone_data->adjust_scale.base; + if (bone_data->motion_loaded.front()->mot_key_data.motion_body_type == 1) v6 *= v4; - case 7: - if (!rob_chr->field_20) + case MA_TYPE_EMY_BODY: + if (!enemy) break; - v6 = rob_chr->field_20->bone_data->ik_scale.ratio1; - if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 = enemy->bone_data->adjust_scale.body; + if (bone_data->motion_loaded.front()->mot_key_data.motion_body_type == 1) v6 *= v4; - case 8: - if (!rob_chr->field_20) + case MA_TYPE_EMY_ARM: + if (!enemy) break; - v6 = rob_chr->field_20->bone_data->ik_scale.ratio2; - if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 = enemy->bone_data->adjust_scale.arm; + if (bone_data->motion_loaded.front()->mot_key_data.motion_body_type == 1) v6 *= v4; - case 9: - if (!rob_chr->field_20) + case MA_TYPE_EMY_HEIGHT: + if (!enemy) break; - v6 = rob_chr->field_20->bone_data->ik_scale.ratio3; - if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) + v6 = enemy->bone_data->adjust_scale.height; + if (bone_data->motion_loaded.front()->mot_key_data.motion_body_type == 1) v6 *= v4; break; - case 10: - if (rob_chr->data.motdata.field_330.field_320 > 0.0f) - v6 = rob_chr->data.motdata.field_330.field_320; + case MA_TYPE_DIRECT: + if (rob_base.motdata.mot_adjust_scale > 0.0f) + v6 = rob_base.motdata.mot_adjust_scale; break; } - v8 = rob_chr->data.motdata.field_330.field_328; + v8 = rob_base.motdata.mot_adjust_base_ypos; } - float_t v15 = rob_chr->data.motion.frame_data.frame; - float_t v16 = rob_chr->data.motdata.field_330.field_314; + float_t v15 = rob_base.robmot.frame.f; + float_t v16 = rob_base.motdata.mot_adjust_end; if (v15 < v16) { - float_t v17 = rob_chr->data.motdata.field_330.field_310; + float_t v17 = rob_base.motdata.mot_adjust_start; if (v15 < v17) { v6 = v5; v8 = v7; @@ -5090,71 +5721,88 @@ static void sub_1405044B0(rob_chara* rob_chr) { } } - rob_chr->data.motion.field_138 = v6; - rob_chr->data.motion.field_13C = v4; - rob_chr->data.motion.field_140.x = 0.0f; - rob_chr->data.motion.field_140.y = v8; - rob_chr->data.motion.field_140.z = 0.0f; + rob_base.robmot.mot_adjust_scale = v6; + rob_base.robmot.mot_xz_adjust_scale = v4; + rob_base.robmot.mot_adjust_base_pos = { 0.0f, v8, 0.0f }; +} + +// 0x14054FE90 +RobAngle rob_chara::calc_mot_yang(bool compel_flag) const { + RobAngle ang = rob_base.position.yang; + if (!compel_flag || !rob_base.flag.bit.compel) { + RobAngle yarare_yang = rob_base.action.yarare.yarare_yang; + if (yarare_yang.value) + return ang + yarare_yang; + } + + if (rob_base.motdata.motkind[MK_TURN]) + return ang + rob_base.motdata.mov_yang; + return ang; +} + +bool rob_chara::check_disp_left() const { + return rob_base.robinfo.flag.bit.disp_left; } void rob_chara::sub_1405070E0(const bone_database* bone_data, const motion_database* mot_db) { if (sub_140419E90(this->bone_data) || this->bone_data->get_motion_has_looped()) sub_140505310(this, bone_data, mot_db); sub_140505980(this); - mothead_apply(&data.motdata, this, data.motion.frame_data.frame, mot_db); - sub_1405044B0(this); + rob_base.motdata.mhd_pp_exec(this, rob_base.robmot.frame.f, mot_db); + calc_mot_adjust_scale(); } void rob_chara::sub_140509D30() { - struc_195* v39 = data.field_1E68.field_DF8; - struc_195* v40 = data.field_1E68.field_1230; - struc_195* v41 = data.field_1E68.field_1668; - mat4* v42 = data.field_1E68.field_78; - mat4* v43 = data.field_1E68.field_738; + prj::BallCollision* cb_hit = rob_base.collision.cb_hit; + prj::BallCollision* cb_rob = rob_base.collision.cb_rob; + prj::BallCollision* cb_stg = rob_base.collision.cb_stg; + mat4* mat = rob_base.collision.mat; + mat4* push_mat = rob_base.collision.push_mat; const RobCollisionData* colli = rob_data->colli_data; const RobCollisionData* push_colli = rob_data->push_colli_data; - mat4* m; - mat4 mat; - for (int32_t i = 0; i < 27; i++) { - m = bone_data->get_mats_mat(colli->bone); - mat4_mul_translate(m, &colli->trans, &mat); - *v42 = mat; + mat4 m; + for (int32_t i = 0; i < ROB_COLLI_ID_MAX; i++) { + mat4_mul_translate(bone_data->get_mats_mat(colli->bone), &colli->trans, &m); + *mat = m; - m = bone_data->get_mats_mat(push_colli->bone); - mat4_mul_translate(m, &push_colli->trans, &mat); - *v43 = mat; + mat4_mul_translate(bone_data->get_mats_mat(push_colli->bone), &push_colli->trans, &m); + *push_mat = m; - float_t chara_scale = data.adjust_data.scale; + float_t scale = rob_base.adjust.scale; - vec3 v23 = *(vec3*)&v42->row3 * chara_scale + data.adjust_data.pos; - *(vec3*)&v42->row3 = v23; + vec3 v23; + mat4_get_translation(mat, &v23); + v23 = v23 * scale + rob_base.adjust.pos; + mat4_set_translation(mat, &v23); - vec3 v29 = *(vec3*)&v43->row3 * chara_scale + data.adjust_data.pos; - *(vec3*)&v43->row3 = v29; + vec3 v29; + mat4_get_translation(push_mat, &v29); + v29 = v29 * scale + rob_base.adjust.pos; + mat4_set_translation(push_mat, &v29); - float_t v20 = colli->scale * chara_scale; - v39->scale = v20; - v39->field_24 = v20; - v39->prev_pos = v39->pos; - v39->pos = v23; + float_t v20 = colli->scale * scale; + cb_hit->ball.r = v20; + cb_hit->org_rad = v20; + cb_hit->old_c = cb_hit->ball.c; + cb_hit->ball.c = v23; - float_t v19 = push_colli->scale * chara_scale; - v40->scale = v19; - v40->field_24 = v19; - v40->prev_pos = v40->pos; - v40->pos = v29; + float_t v19 = push_colli->scale * scale; + cb_rob->ball.r = v19; + cb_rob->org_rad = v19; + cb_rob->old_c = cb_rob->ball.c; + cb_rob->ball.c = v29; - v41->scale = v19; - v41->field_24 = v19; - v41->prev_pos = v41->pos; - v41->pos = v29; + cb_stg->ball.r = v19; + cb_stg->org_rad = v19; + cb_stg->old_c = cb_stg->ball.c; + cb_stg->ball.c = v29; - v39++; - v40++; - v41++; - v42++; - v43++; + cb_hit++; + cb_rob++; + cb_stg++; + mat++; + push_mat++; colli++; push_colli++; } @@ -5162,29 +5810,248 @@ void rob_chara::sub_140509D30() { void rob_chara::sub_1405163C0(int32_t index, mat4& mat) { if (index >= 0 && index <= 26) - mat = data.field_1E68.field_78[index]; + mat = rob_base.collision.mat[index]; } void rob_chara::sub_140551000() { - struc_223* v1 = &data.motdata; - v1->field_330.field_0.current = v1->field_330.field_0.data; + RobMotData* v1 = &rob_base.motdata; + v1->play_prog = v1->play_prog_org; +} + +RobManagement::RobManagement() { + if (instance_count <= 0) { + instance_count++; + init(); + } +} + +RobManagement::~RobManagement() { + instance_count--; + init(); +} + +bool RobManagement::check_alive_rob(ROB_ID id) { + return !rob_impl[id].rob_base.robinfo.flag.bit.death && !rob_impl[id].rob_base.flag.bit.ringout; +} + +bool RobManagement::check_disp_left(ROB_ID id) { + return rob_impl[id].check_disp_left(); +} + +bool RobManagement::check_ringout_only_rob(ROB_ID id) { + return rob_impl[id].rob_base.flag.bit.ringout; +} + +bool RobManagement::check_ringout_transit_rob(ROB_ID id) { + RobBase& rob_base = rob_impl[id].rob_base; + return rob_base.ringout.stand + || rob_base.ringout.fall + || rob_base.ringout.stop + || rob_base.ringout.air + || rob_base.ringout.down + || rob_base.ringout.replay_ringout; +} + +// 0x140531670 +ROB_ID RobManagement::create_rob(CHARA_NUM cn, + const RobInit& ri, int32_t cos_id, bool can_set_default) { + if (!app::TaskWork::check_task_ready(task_rob_manager) + || ri.rob_type < 0 || ri.rob_type >= ROB_TYPE_MAX) + return ROB_ID_NULL; + + int32_t free_id = 0; + while (rob_init[free_id].rob_type != ROB_TYPE_NULL) { + free_id++; + if (free_id >= ROB_ID_MAX) + return ROB_ID_NULL; + } + + ROB_ID id = (ROB_ID)free_id; + if (can_set_default && (cos_id < 0 || cos_id > 498)) + cos_id = 0; + rob_init[id] = ri; + chara_num[id] = cn; + rob_impl[id].set_chara(id, cn, cos_id, ri); + task_rob_manager->AppendInitCharaList(&rob_impl[id]); + return id; +} + +// 0x140531C50 +void RobManagement::dest_all() { + for (int32_t i = 0; i < ROB_ID_MAX; i++) + if (rob_impl[i].type != ROB_TYPE_NULL) { + task_rob_manager->AppendFreeCharaList(&rob_impl[i]); + rob_impl[i].type = ROB_TYPE_NULL; + } +} + +// 0x140531CC0 +void RobManagement::dest_rob(ROB_ID id) { + if (id < 0 || id >= ROB_TYPE_MAX) + return; + + task_rob_manager->AppendFreeCharaList(&rob_impl[id]); + rob_init[id].rob_type = ROB_TYPE_NULL; +} + +float_t RobManagement::get_adjust_scale(ROB_ID id) const { + if (is_init(id)) + return rob_impl[id].rob_base.adjust.scale; + return 1.0f; +} + +// 0x140531F10 +CHARA_NUM RobManagement::get_chara(ROB_ID id) const { + return rob_impl[id].chara_num; +} + +bool RobManagement::get_colli_check_on() const { + return colli_check_on; +} + +// 0x140531F50 +bool RobManagement::get_disp_on(ROB_ID id) const { + if (is_init(id)) + return rob_impl[id].rob_base.flag.bit.disp; + return false; +} + +// 0x140532010 +const vec3* RobManagement::get_gpos(ROB_ID id) const { + return rob_impl[id].get_gpos(); +} + +// 0x140532030 +rob_chara* RobManagement::get_rob(ROB_ID id) { + if (is_init(id)) + return &rob_impl[id]; + return 0; +} + +// 0x1405320A0 +const RobData* RobManagement::get_rob_data(ROB_ID id) const { + return rob_impl[id].rob_data; +} + +// 0x1405320C0 +/*RobDetail* RobManagement::get_rob_detail_if(ROB_ID id) { + return rob_impl[id].rob_detail; +}*/ + +// 0x1405320F0 +rob_chara_bone_data* RobManagement::get_rob_motion_work(ROB_ID id) { + return rob_impl[id].bone_data; +} + +// 0x140532110 +size_t RobManagement::get_rob_num() const { + return ROB_ID_MAX; +} + +// 0x140532120 +RobDisp* RobManagement::get_rob_robdisp_work(ROB_ID id) { + return rob_impl[id].disp; +} + +// 0x140532140 +RobItem* RobManagement::get_rob_robitem_work(ROB_ID id) { + return &rob_impl[id].item; +} + +// 0x140532170 +const RobInit* RobManagement::get_rob_init(ROB_ID id) const { + if (is_init(id)) + return rob_impl[id].get_rob_init(); + return 0; +} + +// 0x1405327B0 +bool RobManagement::is_init(ROB_ID id) const { + return rob_init[id].rob_type != ROB_TYPE_NULL; +} + +// 0x140532D40 +void RobManagement::reset_osage_pos(ROB_ID id) { + rob_impl[id].reset_osage_pos(); +} + +// 0x140532D60 +void RobManagement::reset_rob(const RobInit& rob0, const RobInit& rob1, + const bone_database* bone_data, const motion_database* mot_db) { + if (!get_disp_on(ROB_ID_1P) || !get_disp_on(ROB_ID_2P)) + set_colli_check_on(false); + else + set_colli_check_on(true); + rob_impl[ROB_ID_1P].reset_rob(rob0, bone_data, mot_db); + rob_impl[ROB_ID_2P].reset_rob(rob1, bone_data, mot_db); +} + +// 0x140532DB0 +void RobManagement::reset_rob(ROB_ID id, const RobInit& ri, + const bone_database* bone_data, const motion_database* mot_db) { + rob_impl[id].reset_rob(ri, bone_data, mot_db); + if (!get_disp_on(ROB_ID_1P) || !get_disp_on(ROB_ID_2P)) + set_colli_check_on(false); + else + set_colli_check_on(true); +} + +void RobManagement::set_colli_check_on(bool value) { + colli_check_on = value; +} + +// 0x140532F80 +void RobManagement::set_disp_on(ROB_ID id, bool value) { + rob_impl[id].set_disp_flag(value); +} + +// 0x140533130 +void RobManagement::set_mot_frame(ROB_ID id, float_t frame) { + rob_impl[id]. req_frame_change(frame); +} + +// 0x140533150 +void RobManagement::set_motion(ROB_ID id, int32_t motnum) { + rob_impl[id].set_rob_motion_external(motnum); +} + +// 0x1405331F0 +void RobManagement::set_no_ctrl(ROB_ID id) { + if (id >= 0 && id < ROB_ID_MAX) + rob_impl[id].rob_base.flag.bit.no_ctrl = true; +} + +// 0x140533170 +void RobManagement::set_rob_pos(ROB_ID id, const vec3& pos) { + rob_impl[id].set_rob_pos(pos); +} + +// 0x1405331C0 +void RobManagement::set_rob_yang(ROB_ID id, const RobAngle& ang) { + rob_impl[id].set_rob_yang(ang); +} + +// 0x140531430 +void RobManagement::init() { + for (int32_t i = 0; i < ROB_ID_MAX; i++) + rob_init[i].rob_type = ROB_TYPE_NULL; } pv_data_set_motion::pv_data_set_motion() : frame_stage_index() { - motion_id = -1; + motnum = -1; } -pv_data_set_motion::pv_data_set_motion(uint32_t motion_id) : frame_stage_index() { - this->motion_id = motion_id; +pv_data_set_motion::pv_data_set_motion(uint32_t motnum) : frame_stage_index() { + this->motnum = motnum; } -pv_data_set_motion::pv_data_set_motion(uint32_t motion_id, std::pair frame_stage_index) { - this->motion_id = motion_id; +pv_data_set_motion::pv_data_set_motion(uint32_t motnum, std::pair frame_stage_index) { + this->motnum = motnum; this->frame_stage_index = frame_stage_index; } constexpr bool operator==(const pv_data_set_motion& left, const pv_data_set_motion& right) { - return left.motion_id == right.motion_id && left.frame_stage_index == right.frame_stage_index; + return left.motnum == right.motnum && left.frame_stage_index == right.frame_stage_index; } constexpr bool operator!=(const pv_data_set_motion& left, const pv_data_set_motion& right) { @@ -5192,7 +6059,7 @@ constexpr bool operator!=(const pv_data_set_motion& left, const pv_data_set_moti } constexpr bool operator<(const pv_data_set_motion& left, const pv_data_set_motion& right) { - return left.motion_id < right.motion_id || (!(right.motion_id < left.motion_id) + return left.motnum < right.motnum || (!(right.motnum < left.motnum) && left.frame_stage_index < right.frame_stage_index); } @@ -5210,22 +6077,22 @@ constexpr bool operator>=(const pv_data_set_motion& left, const pv_data_set_moti osage_init_data::osage_init_data() : rob_chr() { pv_id = -1; - motion_id = -1; + motnum = -1; frame = -1; } -osage_init_data::osage_init_data(rob_chara* rob_chr, uint32_t motion_id) { +osage_init_data::osage_init_data(rob_chara* rob_chr, uint32_t motnum) { this->rob_chr = rob_chr; pv_id = -1; - this->motion_id = motion_id; + this->motnum = motnum; frame = -1; } osage_init_data::osage_init_data(rob_chara* rob_chr, int32_t pv_id, - uint32_t motion_id, const std::string& dir, int32_t frame) { + uint32_t motnum, const std::string& dir, int32_t frame) { this->rob_chr = rob_chr; this->pv_id = pv_id; - this->motion_id = motion_id; + this->motnum = motnum; this->dir.assign(dir); this->frame = frame; } @@ -5439,88 +6306,18 @@ void OpdChecker::sub_140471020() { static void bone_data_parent_data_init(bone_data_parent* bone, rob_chara_bone_data* rob_bone_data, const bone_database* bone_data) { - const std::vector* common_bones - = bone_data->get_body_type(rob_bone_data->base_skeleton_type); - const std::vector* motion_chain_pos - = bone_data->get_chain_pos_rad(rob_bone_data->base_skeleton_type); - const std::vector* disp_chain_pos - = bone_data->get_chain_pos_rad(rob_bone_data->skeleton_type); - if (!common_bones || !motion_chain_pos || !disp_chain_pos) + const std::vector* body_type_table + = bone_data->get_body_type_table(rob_bone_data->kind); + const std::vector* joint_table + = bone_data->get_joint_table(rob_bone_data->kind); + const std::vector* disp_joint_table + = bone_data->get_joint_table(rob_bone_data->disp_kind); + if (!body_type_table || !joint_table || !disp_joint_table) return; bone->rob_bone_data = rob_bone_data; bone_data_parent_load_rob_chara(bone); - bone_data_parent_load_bone_database(bone, common_bones, motion_chain_pos->data(), disp_chain_pos->data()); -} - -static void bone_data_parent_load_bone_database(bone_data_parent* bone, - const std::vector* bones, const CHAINPOSRADIUS* motion_chain_pos, const CHAINPOSRADIUS* disp_chain_pos) { - rob_chara_bone_data* rob_bone_data = bone->rob_bone_data; - size_t chain_pos = 0; - size_t node_count = 0; - size_t leaf_pos = 0; - - RobBlock* block = bone->bones.data(); - for (const BODYTYPE& i : *bones ) { - block->block_id = (BONE_BLK)(&i - bones->data()); - block->ik_type = i.ik_type; - block->flip_block_id = (BONE_BLK)i.flip_block_id; - block->inherit_mat_id = (BONE_BLK)i.inherit_mat_id; - block->expression_id = i.expression_id; - block->key_set_count = i.ik_type >= IKT_ROOT ? 6 : 3; - block->chain_pos[0] = (*motion_chain_pos++).chain_pos; - block->chain_pos[1] = (*disp_chain_pos++).chain_pos; - block->node = &rob_bone_data->nodes[node_count]; - block->inherit_type = i.inherit_type; - block->inherit_mat_ptr = i.inherit_type ? &rob_bone_data->mats[i.inherit_mat_id] : 0; - - block->up_vector_mat_ptr = 0; - switch (i.ik_type) { - case IKT_0: - case IKT_0N: - case IKT_0T: - chain_pos++; - node_count++; - break; - case IKT_ROOT: - chain_pos++; - leaf_pos++; - node_count++; - break; - case IKT_1: - block->len[0][0] = (*motion_chain_pos++).chain_pos.x; - block->len[0][1] = (*disp_chain_pos++).chain_pos.x; - - chain_pos += 2; - leaf_pos++; - node_count += 3; - break; - case IKT_2: - case IKT_2R: - block->len[0][0] = (*motion_chain_pos++).chain_pos.x; - block->len[0][1] = (*disp_chain_pos++).chain_pos.x; - block->len[1][0] = (*motion_chain_pos++).chain_pos.x; - block->len[1][1] = (*disp_chain_pos++).chain_pos.x; - - mat4* up_vector_mat = 0; - if (i.up_vector_id) - up_vector_mat = &rob_bone_data->mats[i.up_vector_id]; - block->up_vector_mat_ptr = up_vector_mat; - - chain_pos += 3; - leaf_pos++; - node_count += 4; - break; - } - block++; - } - - if (node_count != rob_bone_data->node_count) - printf_debug_error("Node mismatch"); - if (leaf_pos != bone->leaf_pos) - printf_debug_error("LeafPos mismatch"); - if (chain_pos != bone->chain_pos) - printf_debug_error("ChainPos mismatch"); + bone->ik_init(body_type_table, joint_table->data(), disp_joint_table->data()); } static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, @@ -5535,23 +6332,23 @@ static void bone_data_parent_load_bone_indices_from_mot(bone_data_parent* a1, if (!key_set_count) return; - BONE_KIND skeleton_type = a1->rob_bone_data->base_skeleton_type; + BONE_KIND kind = a1->rob_bone_data->kind; const std::string* bone_name = mot_db->bone_name.data(); const mot_bone_info* bone_info = a2->bone_info_array; for (size_t key_set_offset = 0, i = 0; key_set_offset < key_set_count; i++) { - BONE_BLK bone_index = (BONE_BLK)bone_data->get_block_index( - skeleton_type, bone_name[bone_info[i].index].c_str()); - if (bone_index == -1) { + BONE_BLK blk = (BONE_BLK)bone_data->get_block_index( + kind, bone_name[bone_info[i].index].c_str()); + if (blk == -1) { i++; - bone_index = (BONE_BLK)bone_data->get_block_index( - skeleton_type, bone_name[bone_info[i].index].c_str()); - if (bone_index == -1) + blk = (BONE_BLK)bone_data->get_block_index( + kind, bone_name[bone_info[i].index].c_str()); + if (blk == -1) break; } - bone_indices.push_back((uint16_t)bone_index); + bone_indices.push_back((uint16_t)blk); - RobBlock* block = &a1->bones.data()[bone_index]; + RobBlock* block = &a1->block_vec[blk]; block->key_set_offset = (int32_t)key_set_offset; block->frame = -1.0f; key_set_offset += block->ik_type >= IKT_ROOT ? 6 : 3; @@ -5563,219 +6360,73 @@ static void bone_data_parent_load_rob_chara(bone_data_parent* bone) { if (!rob_bone_data) return; - bone->motion_bone_count = rob_bone_data->motion_bone_count; - bone->leaf_pos = rob_bone_data->leaf_pos; - bone->chain_pos = rob_bone_data->chain_pos; - bone->bones.clear(); - bone->bones.resize(rob_bone_data->motion_bone_count); + bone->block_max = rob_bone_data->block_max; + bone->leaf_pos_max = rob_bone_data->leaf_pos_max; + bone->chain_pos_max = rob_bone_data->chain_pos_max; + bone->block_vec.clear(); + bone->block_vec.resize(rob_bone_data->block_max); bone->global_key_set_count = 6; - bone->bone_key_set_count = (uint32_t)((bone->motion_bone_count + bone->leaf_pos) * 3); + bone->bone_key_set_count = (uint32_t)((bone->block_max + bone->leaf_pos_max) * 3); } -static void mot_interpolate(const mot* a1, float_t frame, float_t* value, - mot_key_set* a4, uint32_t key_set_count, const struc_369* a6) { - if (a6->field_0 == 4) - frame = prj::floorf(frame); +// 0x1405376C0 +static uint32_t get_common_rob_mot(CHARA_NUM cn, uint32_t kamae_type, MOTTABLE_TYPE mottbl_type) { + if (common_mot_tbl_header + && cn >= 0 && (uint32_t)cn < common_mot_tbl_header->cn_num + && mottbl_type >= 0 && (uint32_t)mottbl_type < common_mot_tbl_header->mtp_num) { + CmnMotTblBase* base = (CmnMotTblBase*)((uint8_t*)common_mot_tbl_header + + common_mot_tbl_header->data_tbl); + if (kamae_type < (uint32_t)base[cn].kamae_max) + return ((uint32_t*)((uint8_t*)common_mot_tbl_header + + *(uint32_t*)((uint8_t*)common_mot_tbl_header + + kamae_type * sizeof(uint32_t) + base[cn].tbl)))[mottbl_type]; + } + return -1; +} - if (!key_set_count) +static void mot_key_data_get_key_set_count_by_bone_database_bones( + mot_key_data* a1, const std::vector* body_type_table) { + size_t mat_max; + size_t block_max; + size_t node_max; + size_t leaf_pos_max; + size_t chain_pos_max; + bone_database_bones_calculate_count(body_type_table, mat_max, + block_max, node_max, leaf_pos_max, chain_pos_max); + mot_key_data_get_key_set_count(a1, block_max, leaf_pos_max); +} + +static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t block_max, size_t leaf_pos) { + a1->key_set_count = (block_max + leaf_pos) * 3 + 16; +} + +static void mot_key_data_init(mot_key_data* a1, BONE_KIND kind, const bone_database* bone_data) { + const std::vector* body_type_table = bone_data->get_body_type_table(kind); + if (!body_type_table) return; - for (uint32_t i = key_set_count; i; i--, a4++, value++) { - mot_key_set_type type = a4->type; - const float_t* values = a4->values; - if (type == MOT_KEY_SET_NONE) { - *value = 0.0f; - continue; - } - else if (type == MOT_KEY_SET_STATIC) { - *value = values[0]; - continue; - } - else if (type != MOT_KEY_SET_HERMITE && type != MOT_KEY_SET_HERMITE_TANGENT) { - *value = 0.0f; - continue; - } - - int32_t current_key = a4->current_key; - int32_t keys_count = a4->keys_count; - const uint16_t* frames = a4->frames; - int32_t frame_int = (int32_t)frame; - size_t key_index; - if (current_key > keys_count - || (frame_int > a4->last_key + frames[current_key]) - || current_key > 0 && frame_int < frames[current_key - 1]) { - const uint16_t* key = frames; - size_t length = keys_count; - size_t temp; - while (length > 0) - if (key[temp = length / 2] > frame_int) - length /= 2; - else { - key += temp + 1; - length -= temp + 1; - } - key_index = key - frames; - } - else { - const uint16_t* key = &frames[current_key]; - for (const uint16_t* key_end = &frames[keys_count]; key != key_end; key++) - if (frame_int < *key) - break; - key_index = key - frames; - } - - bool found = false; - if (key_index < keys_count) - for (; key_index < keys_count; key_index++) - if ((float_t)frames[key_index] >= frame) { - found = true; - break; - } - - if (found) { - float_t next_frame = (float_t)frames[key_index]; - if (fabsf(next_frame - frame) > 0.000001f && key_index > 0) { - float_t curr_frame = (float_t)frames[key_index - 1]; - float_t df = frame - curr_frame; - float_t t = df / (next_frame - curr_frame); - if (type == MOT_KEY_SET_HERMITE) { - values += key_index - 1; - float_t p1 = values[0]; - float_t p2 = values[1]; - *value = (t * 2.0f - 3.0f) * (t * t) * (p1 - p2) + p1; - } - else { - values += key_index * 2 - 2; - float_t p1 = values[0]; - float_t p2 = values[2]; - float_t t1 = values[1]; - float_t t2 = values[3]; - float_t t_1 = t - 1.0f; - *value = (t_1 * t1 + t * t2) * t_1 * df - + (t * 2.0f - 3.0f) * (t * t) * (p1 - p2) + p1; - } - a4->current_key = (int32_t)key_index; - continue; - } - } - - if (key_index > 0) - key_index--; - if (type == MOT_KEY_SET_HERMITE) - *value = values[key_index]; - else - *value = values[2 * key_index]; - a4->current_key = (int32_t)key_index; - } -} - -static uint32_t mot_load_last_key_calc(uint16_t keys_count) { - uint16_t v2 = keys_count >> 8; - uint32_t v3 = 16; - if (v2) { - v3 = 8; - keys_count = v2; - } - - if (keys_count >> 4) { - v3 -= 4; - keys_count >>= 4; - } - - if (keys_count >> 2) { - v3 -= 2; - keys_count >>= 2; - } - - if (keys_count & ~0x01) - keys_count = 2; - return v3 - keys_count; -} - -static bool mot_load_file(mot* a1, const mot_data* a2) { - a1->frame_count = 0; - if (!a2) - return 0; - - a1->frame_count = a2->frame_count; - - int32_t key_set_count = a2->key_set_count; - bool skeleton_select = a2->skeleton_select != 0; - a1->key_set_count = key_set_count; - a1->field_4 = a2->info & 0x8000; - - const mot_key_set_data* key_set_file = a2->key_set_array; - mot_key_set* key_set = a1->key_sets; - - for (int32_t i = 0; i < key_set_count; i++, key_set++, key_set_file++) { - key_set->type = key_set_file->type; - if (key_set->type == MOT_KEY_SET_STATIC) - key_set->values = key_set_file->values; - else if (key_set->type != MOT_KEY_SET_NONE) { - uint16_t keys_count = key_set_file->keys_count; - key_set->frames = key_set_file->frames; - key_set->values = key_set_file->values; - - key_set->keys_count = keys_count; - key_set->current_key = 0; - - uint16_t last_key = a1->frame_count; - if (keys_count > 1) { - if (keys_count > last_key) - keys_count = a1->frame_count; - last_key = (16 - mot_load_last_key_calc(keys_count)) * a1->frame_count / keys_count; - } - key_set->last_key = last_key; - } - } - return skeleton_select; -} - -static void mot_key_data_get_key_set_count_by_bone_database_bones(mot_key_data* a1, - const std::vector* a2) { - size_t object_bone_count; - size_t motion_bone_count; - size_t node_count; - size_t leaf_pos; - size_t chain_pos; - bone_database_bones_calculate_count(a2, object_bone_count, - motion_bone_count, node_count, leaf_pos, chain_pos); - mot_key_data_get_key_set_count(a1, motion_bone_count, leaf_pos); -} - -static void mot_key_data_get_key_set_count(mot_key_data* a1, size_t motion_bone_count, size_t leaf_pos) { - a1->key_set_count = (motion_bone_count + leaf_pos) * 3 + 16; -} - -static void mot_key_data_init(mot_key_data* a1, - BONE_KIND type, const bone_database* bone_data) { - const std::vector* bones = bone_data->get_body_type(type); - if (!bones) - return; - - mot_key_data_get_key_set_count_by_bone_database_bones(a1, bones); + mot_key_data_get_key_set_count_by_bone_database_bones(a1, body_type_table); mot_key_data_reserve_key_sets(a1); - a1->skeleton_type = type; + a1->kind = kind; } -static void mot_key_data_init_key_sets(mot_key_data* a1, BONE_KIND type, - size_t motion_bone_count, size_t leaf_pos) { - mot_key_data_get_key_set_count(a1, motion_bone_count, leaf_pos); +static void mot_key_data_init_key_sets(mot_key_data* a1, BONE_KIND kind, size_t block_max, size_t leaf_pos) { + mot_key_data_get_key_set_count(a1, block_max, leaf_pos); mot_key_data_reserve_key_sets(a1); - a1->skeleton_type = type; + a1->kind = kind; } -static const mot_data* mot_key_data_load_file(mot_key_data* a1, uint32_t motion_id, const motion_database* mot_db) { - if (a1->motion_id != motion_id) { - const mot_data* mot_data = motion_storage_get_mot_data(motion_id, mot_db); +static const mot_data* mot_key_data_load_file(mot_key_data* a1, uint32_t motnum, const motion_database* mot_db) { + if (a1->motnum != motnum) { + const mot_data* mot_data = get_motiondata_address(motnum, mot_db); a1->mot_data = mot_data; if (mot_data) { - a1->skeleton_select = mot_load_file(&a1->mot, mot_data); - a1->motion_id = motion_id; + a1->motion_body_type = a1->mot.fcurve_init(mot_data); + a1->motnum = motnum; } else { - a1->skeleton_select = 0; - a1->motion_id = -1; + a1->motion_body_type = 0; + a1->motnum = -1; } } a1->frame = -1.0f; @@ -5790,113 +6441,109 @@ static void mot_key_data_reserve_key_sets(mot_key_data* a1) { a1->fc_value.clear(); a1->fc_value.resize(a1->key_set_count); - a1->mot.key_sets = a1->key_set.data(); + a1->mot.set_fck_ptr(a1->key_set.data()); a1->key_sets_ready = true; } -static void mothead_func_0(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_0(const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_1(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_1( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_2(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_base->motdata.field_0.field_20.field_0 |= 0x100; - rob_chara_data* rob_base = func_data->rob_base; - if (rob_base->motion.field_28 & 0x08) - rob_base->motdata.field_0.field_274 -= ((int16_t*)data)[0]; +void RobMhPp::func_2( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + base->motdata.motkind.set(MK_TURN); + if (base->robmot.flag.bit.mirror) + base->motdata.mov_yang -= ((int16_t*)ppadr)[0]; else - rob_base->motdata.field_0.field_274 += ((int16_t*)data)[0]; + base->motdata.mov_yang += ((int16_t*)ppadr)[0]; } -static void mothead_func_3(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - int32_t v4 = ((int32_t*)data)[0]; - rob_chara_data* rob_base = func_data->rob_base; - (&rob_base->motdata.field_0.field_20.field_0)[v4 >> 5] |= 1 << (v4 & 0x1F); +void RobMhPp::func_3( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + int32_t v4 = ((int32_t*)ppadr)[0]; + base->motdata.motkind.set(v4); } -static void mothead_func_4(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - int32_t v4 = ((int32_t*)data)[0]; - rob_chara_data* rob_base = func_data->rob_base; - (&rob_base->motdata.field_0.field_20.field_0)[v4 >> 5] &= ~(1 << (v4 & 0x1F)); +void RobMhPp::func_4( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + int32_t v4 = ((int32_t*)ppadr)[0]; + base->motdata.motkind.reset(v4); } -static void mothead_func_5(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_base->motion.field_28 ^= 0x04; +void RobMhPp::func_5( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + base->robmot.flag.u32 ^= 0x04; } -static void mothead_func_6(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_base->action.field_1B4 = 0; - func_data->rob_base->motdata.field_0.field_20.field_0 |= 0x400; - func_data->rob_base->motdata.field_0.field_20.field_0 |= 0x800; +void RobMhPp::func_6( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + base->action.down_counter_ex = 0; + base->motdata.motkind.set(MK_DOWN); + base->motdata.motkind.set(MK_DOWN_POSE); } static void sub_140551AF0(rob_chara* rob_chr) { - if (!rob_chr->data.flag.bit.fix_hara) { - rob_chr->data.position.pos.y = rob_chr->data.position.gpos.y; - rob_chr->data.flag.bit.fix_hara = 1; - if (!(rob_chr->data.motdata.field_0.field_1E8 & 0x01)) { - rob_chr->data.position.pos.x = rob_chr->data.position.gpos.x; - rob_chr->data.position.pos.z = rob_chr->data.position.gpos.z; + if (!rob_chr->rob_base.flag.bit.fix_hara) { + rob_chr->rob_base.position.pos.y = rob_chr->rob_base.position.gpos.y; + rob_chr->rob_base.flag.bit.fix_hara = 1; + if (!rob_chr->rob_base.motdata.air_kind[AK_CENTER_MOVE]) { + rob_chr->rob_base.position.pos.x = rob_chr->rob_base.position.gpos.x; + rob_chr->rob_base.position.pos.z = rob_chr->rob_base.position.gpos.z; } } - rob_chr->data.motdata.field_0.field_20.field_0 |= 0x40; + rob_chr->rob_base.motdata.motkind.set(MK_AIR); } -static void mothead_func_7(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - int16_t v4 = ((int16_t*)data)[0]; - rob_chara_data* rob_base = func_data->rob_base; - if (rob_base->motion.field_28 & 0x08) +void RobMhPp::func_7( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + int16_t v4 = ((int16_t*)ppadr)[0]; + if (base->robmot.flag.bit.mirror) v4 = -v4; - float_t v8 = (v4 + rob_base->motdata.field_0.field_2B8 + rob_base->position.yang).get_rad(); - float_t v9 = sinf(v8) * ((float_t*)data)[1]; - float_t v10 = get_gravity() * ((float_t*)data)[2]; - float_t v11 = cosf(v8) * ((float_t*)data)[1]; - rob_base->position.spd.x = v9; - rob_base->position.spd.y = v10; - rob_base->position.spd.z = v11; - sub_140551AF0(func_data->rob_chr); + float_t v8 = (v4 + base->motdata.dturn_yang + base->position.yang).get_rad(); + float_t v9 = sinf(v8) * ((float_t*)ppadr)[1]; + float_t v10 = get_gravity() * ((float_t*)ppadr)[2]; + float_t v11 = cosf(v8) * ((float_t*)ppadr)[1]; + base->position.spd.x = v9; + base->position.spd.y = v10; + base->position.spd.z = v11; + sub_140551AF0(impl); } -static void mothead_func_8(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - //sub_14036D130(0, &((int16_t*)data)[2]); +void RobMhPp::func_8( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + int16_t v4 = *((int16_t*)ppadr + 2); + //PostEvent(EVENT_TYPE_ROB_PP_QUAKE, &v4); } -static void mothead_func_9(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_9( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_10(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_10( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_11(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_11( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_12(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_12( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_13(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_13( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { /*rob_chara* rob_chr; // r8 - rob_chara_data* v5; // r9 + RobBase* v5; // r9 int32_t v6; // ecx int32_t v7; // eax char* v8; // rax @@ -5907,54 +6554,54 @@ static void mothead_func_13(mothead_func_data* func_data, bool v13; // [rsp+2Eh] [rbp-1Ah] int32_t v14; // [rsp+30h] [rbp-18h] - rob_chr = func_data->rob_chr; - v5 = func_data->rob_base; - v6 = ((int32_t*)data)[1]; + rob_chr = impl; + v5 = base; + v6 = ((int32_t*)ppadr)[1]; v10 = -1; v11 = -1; v12 = 0; v13 = 0; v14 = 0; - LODWORD(v10) = rob_chr->chara_id; - v11 = ((int32_t*)data)[0]; - v12 = (v5->motion.field_28 & 8) != 0; + LODWORD(v10) = rob_chr->idnm; + v11 = ((int32_t*)ppadr)[0]; + v12 = (v5->motion.flag.u32 & 8) != 0; if (v6 & 0x01) { - v8 = (char*)rob_chr->field_20; + v8 = (char*)rob_chr->enemy; if (!v8) return; v7 = *v8; } else - v7 = rob_chr->chara_id; + v7 = rob_chr->idnm; HIDWORD(v10) = v7; v9 = v5->field_8.field_150; HIBYTE(v12) = v9; if ((v6 & 2) != 0) HIBYTE(v12) = !v9; - v14 = ((int32_t*)data)[2]; + v14 = ((int32_t*)ppadr)[2]; v13 = (v6 & 4) != 0; sub_1401FCE40((int64_t)&v10);*/ } -static void mothead_func_14(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_14( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_15(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_15( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_16(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_16( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_17(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_17( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { /*__int16 v4; // r14 - rob_chara_data* v5; // rsi + RobBase* v5; // rsi float_t v8; // xmm3_4 float_t v9; // xmm3_4 float_t v10; // xmm0_4 @@ -5970,331 +6617,308 @@ static void mothead_func_17(mothead_func_data* func_data, __int16* v20; // rcx float_t v21; // xmm2_4 float_t v22; // xmm0_4 - rob_chara_data* v23; // rax + RobBase* v23; // rax float_t v24; // xmm1_4 float_t v25; // xmm3_4 - rob_chara_data* v26; // rax + RobBase* v26; // rax float_t v27; // xmm3_4 float_t v28; // xmm0_4 __m128 v29; // xmm2 float_t v30; // xmm0_4 float_t v31; // xmm1_4 - rob_chara_data* v32; // rax + RobBase* v32; // rax float_t v33; // xmm2_4 float_t v34; // xmm1_4 float_t v35; // xmm0_4 - rob_chara_data* v36; // r14 + RobBase* v36; // r14 float_t v37; // xmm0_4 vec3 a3; // [rsp+20h] [rbp-30h] BYREF vec3 v39; // [rsp+30h] [rbp-20h] BYREF __int16 a1; // [rsp+70h] [rbp+20h] BYREF - v4 = ((int16_t*)data)[1]; - v5 = func_data->rob_base; + v4 = ((int16_t*)ppadr)[1]; + v5 = base; if (v4 & 0x02) { - v8 = v5->field_1E68.field_1EB4[0].field_0; + v8 = v5->collision.field_1EB4[0].field_0; a1 = v5->position.field_2; if (v8 > 4.0) return; - v9 = v8 - ((float_t*)data)[5]; - v10 = ((float_t*)data)[1]; - if (v9 < v10 && v10 >= 0.0f || (v10 = ((float_t*)data)[2], v9 > v10) && v10 >= 0.0f) + v9 = v8 - ((float_t*)ppadr)[5]; + v10 = ((float_t*)ppadr)[1]; + if (v9 < v10 && v10 >= 0.0f || (v10 = ((float_t*)ppadr)[2], v9 > v10) && v10 >= 0.0f) v9 = v10; LABEL_8: - v11 = &v5->motdata.field_330.field_20.x; - sub_1405357B0(&a1, &v5->position.gpos, &v5->motdata.field_330.field_20, v9); - v5->motdata.field_330.field_18 = 1; + v11 = &v5->motdata.target.target_pos.x; + sub_1405357B0(&a1, &v5->position.gpos, &v5->motdata.target.target_pos, v9); + v5->motdata.target.target_flag = ROB_TARGET_WALL; goto LABEL_27; } if (v4 & 0x04) { - v12 = v5->field_1E68.field_1EB4[2].field_0; + v12 = v5->collision.field_1EB4[2].field_0; a1 = v5->position.field_2 + 0x8000; if (v12 > 4.0) return; - v9 = v12 - ((float_t*)data)[5]; - v13 = ((float_t*)data)[1]; - if (v9 < v13 && v13 >= 0.0f || (v13 = ((float_t*)data)[2], v9 > v13) && v13 >= 0.0f) + v9 = v12 - ((float_t*)ppadr)[5]; + v13 = ((float_t*)ppadr)[1]; + if (v9 < v13 && v13 >= 0.0f || (v13 = ((float_t*)ppadr)[2], v9 > v13) && v13 >= 0.0f) v9 = v13; goto LABEL_8; } if (!(v4 & 0x01)) return; - v14 = ((float_t*)data)[2]; - v15 = ((float_t*)data)[3]; - v16 = ((float_t*)data)[5]; - v17 = ((float_t*)data)[4]; - v5->motdata.field_330.field_18 = 2; + v14 = ((float_t*)ppadr)[2]; + v15 = ((float_t*)ppadr)[3]; + v16 = ((float_t*)ppadr)[5]; + v17 = ((float_t*)ppadr)[4]; + v5->motdata.target.target_flag = ROB_TARGET_ENEMY; v18 = -v16; - if (v18 >= *((float_t*)data + 1)) { + if (v18 >= *((float_t*)ppadr + 1)) { if (v14 < 0.0f) { if ((v4 & 0x20) != 0) - v14 = ((float_t*)data)[1]; + v14 = ((float_t*)ppadr)[1]; v18 = v18 - (float_t)-v14; } } else - v18 = ((float_t*)data)[1]; - v5->motdata.field_330.field_20.z = v17; - v5->motdata.field_330.field_20.y = 0.0f; - v11 = &v5->motdata.field_330.field_20.x; + v18 = ((float_t*)ppadr)[1]; + v5->motdata.target.target_pos.z = v17; + v5->motdata.target.target_pos.y = 0.0f; + v11 = &v5->motdata.target.target_pos.x; *(int64_t*)&v39.x = 0; v39.z = 0.0f; - v5->motdata.field_330.field_20.x = v15; - v19 = ((int16_t*)data)[0]; + v5->motdata.target.target_pos.x = v15; + v19 = ((int16_t*)ppadr)[0]; *(int64_t*)&a3.x = 0; a3.z = 0.0f; - sub_140533530(func_data, (float_t)v19, &a3); - sub_140533530(func_data, func_data->rob_base->motion.frame_data.frame, &v39); - v20 = &func_data->rob_base->position.field_2; + sub_140533530(this, (float_t)v19, &a3); + sub_140533530(this, base->robmot.frame.f, &v39); + v20 = &base->position.field_2; a3.x = a3.x - v39.x; a3.z = a3.z - v39.z; sub_140535710(v20, &a3.x, &a3.x); - a1 = func_data->field_10->position.field_2; - sub_140535710(&a1, &v5->motdata.field_330.field_20.x, &v5->motdata.field_330.field_20.x); - v21 = v5->motdata.field_330.field_20.x - a3.x; - v22 = v5->motdata.field_330.field_20.z - a3.z; - v5->motdata.field_330.field_20.x = v21; - v5->motdata.field_330.field_20.z = v22; - v23 = func_data->field_10; - v24 = v23->position.gpos.y + v5->motdata.field_330.field_20.y; - v25 = v23->position.gpos.z + v5->motdata.field_330.field_20.z; - v5->motdata.field_330.field_20.x = v21 + v23->position.gpos.x; - v26 = func_data->rob_base; - v5->motdata.field_330.field_20.y = v24; - v5->motdata.field_330.field_20.z = v25; + a1 = motd->position.field_2; + sub_140535710(&a1, &v5->motdata.target.target_pos.x, &v5->motdata.target.target_pos.x); + v21 = v5->motdata.target.target_pos.x - a3.x; + v22 = v5->motdata.target.target_pos.z - a3.z; + v5->motdata.target.target_pos.x = v21; + v5->motdata.target.target_pos.z = v22; + v23 = motd; + v24 = v23->position.gpos.y + v5->motdata.target.target_pos.y; + v25 = v23->position.gpos.z + v5->motdata.target.target_pos.z; + v5->motdata.target.target_pos.x = v21 + v23->position.gpos.x; + v26 = base; + v5->motdata.target.target_pos.y = v24; + v5->motdata.target.target_pos.z = v25; v27 = v25 - v26->position.gpos.z; - v28 = v5->motdata.field_330.field_20.x - v26->position.gpos.x; - v5->motdata.field_330.field_20.y = v24 - v26->position.gpos.y; - v5->motdata.field_330.field_20.z = v27; - v5->motdata.field_330.field_20.x = v28; - v5->motdata.field_330.field_20.y = 0.0f; - v29 = (__m128)LODWORD(v5->motdata.field_330.field_20.x); + v28 = v5->motdata.target.target_pos.x - v26->position.gpos.x; + v5->motdata.target.target_pos.y = v24 - v26->position.gpos.y; + v5->motdata.target.target_pos.z = v27; + v5->motdata.target.target_pos.x = v28; + v5->motdata.target.target_pos.y = 0.0f; + v29 = (__m128)LODWORD(v5->motdata.target.target_pos.x); v29.m128_f32[0] = (float_t)((float_t)(v29.m128_f32[0] * v29.m128_f32[0]) - + (float_t)(v5->motdata.field_330.field_20.y * v5->motdata.field_330.field_20.y)) - + (float_t)(v5->motdata.field_330.field_20.z * v5->motdata.field_330.field_20.z); + + (float_t)(v5->motdata.target.target_pos.y * v5->motdata.target.target_pos.y)) + + (float_t)(v5->motdata.target.target_pos.z * v5->motdata.target.target_pos.z); if (_mm_sqrt_ps(v29).m128_f32[0] > v18) { - vec3::normalize(&v5->motdata.field_330.field_20); + vec3::normalize(&v5->motdata.target.target_pos); v30 = v18 * *v11; - v31 = v18 * v5->motdata.field_330.field_20.y; - v5->motdata.field_330.field_20.z = v18 * v5->motdata.field_330.field_20.z; + v31 = v18 * v5->motdata.target.target_pos.y; + v5->motdata.target.target_pos.z = v18 * v5->motdata.target.target_pos.z; *v11 = v30; - v5->motdata.field_330.field_20.y = v31; + v5->motdata.target.target_pos.y = v31; } - v32 = func_data->rob_base; - v33 = v32->position.gpos.z + v5->motdata.field_330.field_20.z; - v34 = v32->position.gpos.y + v5->motdata.field_330.field_20.y; + v32 = base; + v33 = v32->position.gpos.z + v5->motdata.target.target_pos.z; + v34 = v32->position.gpos.y + v5->motdata.target.target_pos.y; *v11 = v32->position.gpos.x + *v11; - v5->motdata.field_330.field_20.y = v34; - v5->motdata.field_330.field_20.z = v33; + v5->motdata.target.target_pos.y = v34; + v5->motdata.target.target_pos.z = v33; LABEL_27: - v35 = (float_t)((int16_t*)data)[0]; - v5->motdata.field_330.field_1C = v35; + v35 = (float_t)((int16_t*)ppadr)[0]; + v5->motdata.target.target_end = v35; if (v4 & 0x08) { - v36 = func_data->rob_base; - if (v35 < v36->motdata.field_0.field_1F4) - v35 = v36->motdata.field_0.field_1F4; - v37 = v35 - v36->motion.frame_data.frame; + v36 = base; + if (v35 < v36->motdata.land_frame) + v35 = v36->motdata.land_frame; + v37 = v35 - v36->motion.frame.f; if (v37 < 1.0) v37 = 1.0; v36->position.spd.x = (float_t)(*v11 - v36->position.gpos.x) * (float_t)(1.0 / v37); - v36->position.spd.z = (float_t)(v5->motdata.field_330.field_20.z - v36->position.gpos.z) + v36->position.spd.z = (float_t)(v5->motdata.target.target_pos.z - v36->position.gpos.z) * (float_t)(1.0 / v37); - v36->position.spd.y = get_gravity() * ((float_t*)data)[6]; - func_data->rob_base->field_8.field_B8.field_10.y = 0.0f; - sub_140551AF0(func_data->rob_chr); + v36->position.spd.y = get_gravity() * ((float_t*)ppadr)[6]; + base->field_8.field_B8.field_10.y = 0.0f; + sub_140551AF0(impl); }*/ } -static void mothead_func_18(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_18( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_19(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_19( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_20(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_20( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_21(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_21( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_22(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_22( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_23(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_23( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_24(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_24( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_25(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_25( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_26(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_26( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_27(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_27( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_28(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_28( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_29(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - /*char* v5; // rbx - __int16 v8; // r9 - int32_t v9; // eax - int32_t v10; // eax - rob_chara_data* v11; // rdx - uint16_t v12; // r8 - int64_t v13; // r9 - float_t v14; // xmm5_4 - float_t v15; // xmm2_4 - float_t v16; // xmm3_4 - float_t v17; // xmm6_4 - float_t v18; // xmm7_4 - float_t v19; // xmm8_4 - float_t v20; // xmm9_4 - float_t v21; // xmm10_4 - float_t v22; // xmm4_4 - int64_t v23; // rcx - __int16 v24; // ax - int32_t* v25; // [rsp+88h] [rbp+10h] BYREF +void RobMhPp::func_29( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + prj::BitArrayExt<10> flag(&((uint32_t*)ppadr)[13]); + uint16_t v8 = ((uint16_t*)ppadr)[24]; + if (!flag.count() || (v8 != 0 || flag[impl->cos_id]) && (v8 != 1 || !flag[impl->cos_id])) { + int16_t end_frame = ((int16_t*)ppadr)[0]; + uint16_t part = ((uint16_t*)ppadr)[1]; + int16_t mode = ((int16_t*)ppadr)[2]; + int16_t target_id = ((int16_t*)ppadr)[3]; + float_t ofsx = ((float_t*)ppadr)[2]; + float_t ofsy = ((float_t*)ppadr)[3]; + float_t ofsz = ((float_t*)ppadr)[4]; + int16_t limit = ((int16_t*)ppadr)[5]; + float_t minx = ((float_t*)ppadr)[6]; + float_t miny = ((float_t*)ppadr)[7]; + float_t minz = ((float_t*)ppadr)[8]; + float_t maxx = ((float_t*)ppadr)[9]; + float_t maxy = ((float_t*)ppadr)[10]; + float_t maxz = ((float_t*)ppadr)[11]; - v5 = (char*)data + 52; - v25 = (int32_t*)((char*)data + 52); - if (!sub_1405333D0(&v25) - || ((v8 = *((int16_t*)data + 24)) != 0 - || (v9 = *(int32_t*)&v5[4 * ((uint64_t)(int32_t)func_data->rob_chr->chara_num >> 5)], - _bittest(&v9, func_data->rob_chr->chara_num & 0x1F))) - && (v8 != 1 - || (v10 = *(int32_t*)&v5[4 * ((uint64_t)(int32_t)func_data->rob_chr->chara_num >> 5)], - !_bittest(&v10, func_data->rob_chr->chara_num & 0x1F)))) { - v11 = func_data->rob_base; - v12 = ((int16_t*)data)[1]; - LOWORD(v13) = ((int16_t*)data)[3]; - v14 = ((float_t*)data)[2]; - v15 = ((float_t*)data)[4]; - v16 = ((float_t*)data)[8]; - v17 = ((float_t*)data)[3]; - v18 = ((float_t*)data)[6]; - v19 = ((float_t*)data)[7]; - v20 = ((float_t*)data)[9]; - v21 = ((float_t*)data)[10]; - v22 = ((float_t*)data)[11]; - if (v11->motion.field_28 & 8) { - v12 = word_140A2D430[v12]; - v13 = word_140A2D440[(__int16)v13]; - if (stru_140A2D480[v13].field_0) { - v14 = -v14; - v18 = -v18; - v20 = -v20; + if (base->robmot.flag.bit.mirror) { + part = leaf_ctrl_part_mirror_tbl[part]; + target_id = leaf_ctrl_target_mirror_tbl[target_id]; + if (leaf_ctrl_tagofs_mirror_flip_tbl[target_id][0]) { + ofsx = -ofsx; + minx = -minx; + maxx = -maxx; } - if (stru_140A2D480[v13].field_1) { - v17 = -v17; - v19 = -v19; - v21 = -v21; + if (leaf_ctrl_tagofs_mirror_flip_tbl[target_id][1]) { + ofsy = -ofsy; + miny = -miny; + maxy = -maxy; } - if (stru_140A2D480[v13].field_2) { - v15 = -v15; - v16 = -v16; - v22 = -v22; + if (leaf_ctrl_tagofs_mirror_flip_tbl[target_id][2]) { + ofsz = -ofsz; + minz = -minz; + maxz = -maxz; } } - v23 = v12; - v11->motdata.field_330.field_33C[v23].field_0 = *((int16_t*)data + 2); - v11->motdata.field_330.field_33C[v23].frame = (float_t)mhd_data->frame; - v11->motdata.field_330.field_33C[v23].field_8 = (float_t)*(__int16*)data; - if (((int16_t*)data)[2] != 1) { - v11->motdata.field_330.field_33C[v23].field_C = v13; - v24 = *((int16_t*)data + 10); - v11->motdata.field_330.field_33C[v23].field_10.x = v14; - v11->motdata.field_330.field_33C[v23].field_1C.x = v18; - v11->motdata.field_330.field_33C[v23].field_28.x = v20; - v11->motdata.field_330.field_33C[v23].field_10.y = v17; - v11->motdata.field_330.field_33C[v23].field_E = v24; - v11->motdata.field_330.field_33C[v23].field_1C.y = v19; - v11->motdata.field_330.field_33C[v23].field_28.y = v21; - v11->motdata.field_330.field_33C[v23].field_10.z = v15; - v11->motdata.field_330.field_33C[v23].field_1C.z = v16; - v11->motdata.field_330.field_33C[v23].field_28.z = v22; + + MotLeafCtrl& leaf_ctrl = base->motdata.leaf_ctrl[part]; + leaf_ctrl.mode = mode; + leaf_ctrl.start_frame = (float_t)list->frame; + leaf_ctrl.end_frame = (float_t)end_frame; + if (mode != 1) { + leaf_ctrl.target_id = target_id; + leaf_ctrl.limit = limit; + leaf_ctrl.ofs.x = ofsx; + leaf_ctrl.ofs.y = ofsy; + leaf_ctrl.ofs.z = ofsz; + leaf_ctrl.min.x = minx; + leaf_ctrl.min.y = miny; + leaf_ctrl.min.z = minz; + leaf_ctrl.max.x = maxx; + leaf_ctrl.max.y = maxy; + leaf_ctrl.max.z = maxz; } - }*/ + } } -static void mothead_func_30(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_base->position.spd.x = 0.0f; - func_data->rob_base->position.spd.z = 0.0f; +void RobMhPp::func_30( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + base->position.spd.x = 0.0f; + base->position.spd.z = 0.0f; } -static void mothead_func_31(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_31( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } static int32_t sub_140533440(int32_t a1) { static const uint8_t byte_140A2D538[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x0A, 0x0B, 0x0C, 0x0D, - 0x0E, 0x05, 0x06, 0x07, 0x08, 0x09, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1A, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, + ROB_COLLI_ID_KOSHI, ROB_COLLI_ID_MUNE_L, ROB_COLLI_ID_MUNE_R, ROB_COLLI_ID_KUBI, ROB_COLLI_ID_KAO, + ROB_COLLI_ID_KATA_L1, ROB_COLLI_ID_KATA_L2, ROB_COLLI_ID_UDE_L1, ROB_COLLI_ID_UDE_L2, ROB_COLLI_ID_TE_L, + ROB_COLLI_ID_KATA_R1, ROB_COLLI_ID_KATA_R2, ROB_COLLI_ID_UDE_R1, ROB_COLLI_ID_UDE_R2, ROB_COLLI_ID_TE_R, + ROB_COLLI_ID_MOMO_L1, ROB_COLLI_ID_MOMO_L2, ROB_COLLI_ID_SUNE_L1, + ROB_COLLI_ID_SUNE_L2, ROB_COLLI_ID_ASI_L, ROB_COLLI_ID_TOE_L, + ROB_COLLI_ID_MOMO_R1, ROB_COLLI_ID_MOMO_R2, ROB_COLLI_ID_SUNE_R1, + ROB_COLLI_ID_SUNE_R2, ROB_COLLI_ID_ASI_R, ROB_COLLI_ID_TOE_R, }; int32_t v3 = a1 & 0xF800001F; - for (int32_t i = 0; i < 27; i++) + for (int32_t i = 0; i < ROB_COLLI_ID_MAX; i++) if (a1 & (1 << i)) v3 |= 1 << byte_140A2D538[i]; return v3; } -static void mothead_func_32(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara_data* rob_base = func_data->rob_base; - struc_651& v2 = rob_base->motdata.field_330; - - float_t v8 = (float_t)((int16_t*)data)[0]; - int32_t v5 = ((int32_t*)data)[1]; - float_t v9 = ((float_t*)data)[2]; - int32_t v10 = ((int32_t*)data)[3]; +void RobMhPp::func_32( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + float_t v8 = (float_t)((int16_t*)ppadr)[0]; + int32_t v5 = ((int32_t*)ppadr)[1]; + float_t v9 = ((float_t*)ppadr)[2]; + int32_t v10 = ((int32_t*)ppadr)[3]; if (v8 == (int16_t)0xFA0C && v10 == 0xD62721C5) { // X float_t value = v9; float_t duration = (float_t)v5; - v2.arm_adjust_next_value = value; - v2.arm_adjust_prev_value = rob_base->arm_adjust_scale; - v2.arm_adjust_start_frame = mhd_data->frame; - v2.arm_adjust_duration = max_def(duration, 0.0f); + base->motdata.arm_adjust_next_value = value; + base->motdata.arm_adjust_prev_value = base->arm_adjust_scale; + base->motdata.arm_adjust_start_frame = list->frame; + base->motdata.arm_adjust_duration = max_def(duration, 0.0f); return; } - if (rob_base->motion.field_28 & 0x08) + if (base->robmot.flag.bit.mirror) v5 = sub_140533440(v5); - float_t v7 = rob_base->motdata.field_0.frame - 1.0f - - rob_base->motion.frame_data.frame; + float_t v7 = base->motdata.frame - 1.0f - base->robmot.frame.f; if (v7 >= v8) v7 = v8; @@ -6302,201 +6926,190 @@ static void mothead_func_32(mothead_func_data* func_data, if (!(v10 & (1 << i))) continue; - for (int32_t j = 0; j < 27; j++) { + for (int32_t j = 0; j < ROB_COLLI_ID_MAX; j++) { if (!(v5 & (1 << j))) continue; - v2.field_2C[i].field_0[j] = 1; - v2.field_80[i].field_0[j] = v9; - v2.field_1C4[i].field_0[j] = v7; + base->motdata.colliball_flag[i][j] = true; + base->motdata.colliball_ratio[i][j] = v9; + base->motdata.colliball_timer[i][j] = v7; } } } -static uint64_t sub_1405333D0(uint32_t a1) { - uint64_t v1 = a1; - v1 = (((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555)) & 0x33333333) - + ((((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555)) >> 2) & 0x33333333); - return (((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) & 0xFF00FF) - + ((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) >> 8) & 0xFF00FF)) >> 16) - + (((v1 & 0xF) + ((v1 >> 4) & 0xF)) + (((v1 & 0xF0F) + ((v1 >> 4) & 0xF0F)) >> 8)); -} - -static void mothead_func_33(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - uint32_t* v5 = (uint32_t*)((size_t)data + 16); - if (sub_1405333D0(((uint32_t*)((size_t)data + 16))[0]) - && !(v5[(uint64_t)(int32_t)func_data->rob_chr->chara_num >> 5] - & (1 << (func_data->rob_chr->chara_num & 0x1F)))) +void RobMhPp::func_33( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + prj::BitArrayExt<10> flag(&((uint32_t*)ppadr)[4]); + if (flag.count() && !flag[impl->cos_id]) return; - uint32_t* v10 = (uint32_t*)func_data->rob_chr->field_20; - if (sub_1405333D0(((uint32_t*)((size_t)data + 20))[0]) && !(func_data->rob_chr->field_20 - && (((uint32_t*)data + ((uint64_t)v10[4] >> 5))[5] & (1 << (v10[4] & 0x1F))))) + prj::BitArrayExt<10> flag_enemy(&((uint32_t*)ppadr)[5]); + rob_chara* enemy = impl->enemy; + if (flag_enemy.count() && !(enemy && flag_enemy[impl->cos_id])) return; - struc_223* v8 = &func_data->rob_base->motdata; - v8->field_330.field_310 = (float_t)mhd_data->frame; - v8->field_330.field_314 = (float_t)((int16_t*)data)[0]; - v8->field_330.field_318 = ((uint8_t*)data)[2]; - v8->field_330.field_31C = ((int32_t*)data)[1]; - v8->field_330.field_320 = ((float_t*)data)[2]; - v8->field_330.field_324 = func_data->rob_base->motion.field_138; - v8->field_330.field_328 = ((float_t*)data)[3]; - v8->field_330.field_32C = func_data->rob_base->motion.field_140.y; + RobMotData& motdata = base->motdata; + motdata.mot_adjust_start = (float_t)list->frame; + motdata.mot_adjust_end = (float_t)((int16_t*)ppadr)[0]; + motdata.mot_adjust_flag = ((uint8_t*)ppadr)[2]; + motdata.mot_adjust_type = (MotAdjustType)((int32_t*)ppadr)[1]; + motdata.mot_adjust_scale = ((float_t*)ppadr)[2]; + motdata.pre_adjust_scale = base->robmot.mot_adjust_scale; + motdata.mot_adjust_base_ypos = ((float_t*)ppadr)[3]; + motdata.pre_adjust_base_ypos = base->robmot.mot_adjust_base_pos.y; } -static void mothead_func_34(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_34( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_35(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_35( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_36(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_36( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_37(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_37( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_38(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_38( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_39(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_39( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_40(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_40( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_41(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_41( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_42(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_42( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_43(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_43( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_44(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_44( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_45(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_45( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_46(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_46( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_47(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_47( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_48(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_48( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_49(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_49( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void rob_chara_set_face_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_face_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); -static void mothead_func_50_set_face_motion_id(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara_set_face_motion_id(func_data->rob_chr, ((int32_t*)data)[0], - ((float_t*)data)[1], ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); +void RobMhPp::func_50_set_face_motion_id( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara_set_face_motion_id(impl, ((int32_t*)ppadr)[0], + ((float_t*)ppadr)[1], ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } -static void mothead_func_51(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_51( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_52(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_52( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_53_set_face_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_face_mottbl_motion(0, ((int32_t*)data)[0], ((float_t*)data)[1], - (rob_partial_motion_playback_state)((int32_t*)data)[3], ((float_t*)data)[2] * 6.0f, - ((float_t*)data)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, false, mot_db); +void RobMhPp::func_53_set_face_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_face_mottbl_motion(0, (MOTTABLE_TYPE)((uint32_t*)ppadr)[0], ((float_t*)ppadr)[1], + (rob_partial_motion_playback_state)((int32_t*)ppadr)[3], ((float_t*)ppadr)[2] * 6.0f, + ((float_t*)ppadr)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, false, mot_db); } -static void mothead_func_54_set_hand_r_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_hand_r_mottbl_motion(0, ((int32_t*)data)[0], ((float_t*)data)[1], - (rob_partial_motion_playback_state)((int32_t*)data)[3], ((float_t*)data)[2] * 12.0f, - ((float_t*)data)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); +void RobMhPp::func_54_set_hand_r_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_hand_r_mottbl_motion(0, (MOTTABLE_TYPE)((uint32_t*)ppadr)[0], ((float_t*)ppadr)[1], + (rob_partial_motion_playback_state)((int32_t*)ppadr)[3], ((float_t*)ppadr)[2] * 12.0f, + ((float_t*)ppadr)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } -static void mothead_func_55_set_hand_l_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_hand_l_mottbl_motion(0, ((int32_t*)data)[0], ((float_t*)data)[1], - (rob_partial_motion_playback_state)((int32_t*)data)[3], ((float_t*)data)[2] * 12.0f, - ((float_t*)data)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); +void RobMhPp::func_55_set_hand_l_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_hand_l_mottbl_motion(0, (MOTTABLE_TYPE)((uint32_t*)ppadr)[0], ((float_t*)ppadr)[1], + (rob_partial_motion_playback_state)((int32_t*)ppadr)[3], ((float_t*)ppadr)[2] * 12.0f, + ((float_t*)ppadr)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } -static void mothead_func_56_set_mouth_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_mouth_mottbl_motion(0, ((int32_t*)data)[0], ((float_t*)data)[1], - (rob_partial_motion_playback_state)((int32_t*)data)[3], ((float_t*)data)[2] * 6.0f, - ((float_t*)data)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); +void RobMhPp::func_56_set_mouth_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_mouth_mottbl_motion(0, (MOTTABLE_TYPE)((uint32_t*)ppadr)[0], ((float_t*)ppadr)[1], + (rob_partial_motion_playback_state)((int32_t*)ppadr)[3], ((float_t*)ppadr)[2] * 6.0f, + ((float_t*)ppadr)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } -static void mothead_func_57_set_eyes_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_eyes_mottbl_motion(0, ((int32_t*)data)[0], ((float_t*)data)[1], - (rob_partial_motion_playback_state)((int32_t*)data)[3], ((float_t*)data)[2] * 6.0f, - ((float_t*)data)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); +void RobMhPp::func_57_set_eyes_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_eyes_mottbl_motion(0, (MOTTABLE_TYPE)((uint32_t*)ppadr)[0], ((float_t*)ppadr)[1], + (rob_partial_motion_playback_state)((int32_t*)ppadr)[3], ((float_t*)ppadr)[2] * 6.0f, + ((float_t*)ppadr)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } -static void mothead_func_58_set_eyelid_mottbl_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_eyelid_mottbl_motion(0, ((int32_t*)data)[0], ((float_t*)data)[1], - (rob_partial_motion_playback_state)((int32_t*)data)[3], ((float_t*)data)[2] * 6.0f, - ((float_t*)data)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); +void RobMhPp::func_58_set_eyelid_mottbl_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_eyelid_mottbl_motion(0, (MOTTABLE_TYPE)((uint32_t*)ppadr)[0], ((float_t*)ppadr)[1], + (rob_partial_motion_playback_state)((int32_t*)ppadr)[3], ((float_t*)ppadr)[2] * 6.0f, + ((float_t*)ppadr)[4], 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } -static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); -static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); static void rob_chara_set_head_object(rob_chara* rob_chr, int32_t head_object_id, const motion_database* mot_db) { - rob_chr->data.motion.field_150.head_object = rob_chara_get_head_object(rob_chr, head_object_id); + rob_chr->rob_base.robmot.field_150.head_object = rob_chara_get_head_object(rob_chr, head_object_id); rob_chara_set_face_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); rob_chara_set_eyelid_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, @@ -6506,97 +7119,97 @@ static void rob_chara_set_head_object(rob_chara* rob_chr, int32_t head_object_id rob_chr->bone_data->look_anim.disable = true; } -static void mothead_func_59_set_rob_chara_head_object(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara_set_head_object(func_data->rob_chr, ((int32_t*)data)[0], mot_db); +void RobMhPp::func_59_set_rob_chara_head_object( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara_set_head_object(impl, ((int32_t*)ppadr)[0], mot_db); } -static void mothead_func_60_set_look_camera(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_look_camera(true, ((int32_t*)data)[0] != 0, - ((float_t*)data)[1], ((float_t*)data)[2], ((float_t*)data)[3] * 6.0f, 0.25f, 0.0f, false); +void RobMhPp::func_60_set_look_camera( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_look_camera(true, ((int32_t*)ppadr)[0] != 0, + ((float_t*)ppadr)[1], ((float_t*)ppadr)[2], ((float_t*)ppadr)[3] * 6.0f, 0.25f, 0.0f, false); } -static void mothead_func_61_set_eyelid_motion_from_face(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_eyelid_mottbl_motion_from_face( - ((int32_t*)data)[0], ((float_t*)data)[1] * 6.0f, -1.0f, 0.0f, mot_db); +void RobMhPp::func_61_set_eyelid_motion_from_face( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_eyelid_mottbl_motion_from_face( + ((int32_t*)ppadr)[0], ((float_t*)ppadr)[1] * 6.0f, -1.0f, 0.0f, mot_db); } static void rob_chara_set_parts_adjust_by_index(rob_chara* rob_chr, rob_osage_parts index, rob_chara_data_adjust* adjust) { if (index >= ROB_OSAGE_PARTS_LEFT && index <= ROB_OSAGE_PARTS_ANGEL_R) rob_chara_set_adjust(rob_chr, adjust, - &rob_chr->data.motion.parts_adjust[index], - &rob_chr->data.motion.parts_adjust_prev[index]); + &rob_chr->rob_base.robmot.parts_adjust[index], + &rob_chr->rob_base.robmot.parts_adjust_prev[index]); } -static void mothead_func_62_rob_parts_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara* rob_chr = func_data->rob_chr; +void RobMhPp::func_62_rob_parts_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara* rob_chr = impl; rob_chara_data_adjust v16; v16.reset(); - int8_t type = ((int8_t*)data)[5]; + int8_t type = ((int8_t*)ppadr)[5]; if (type >= 0 && type < 6) { - float_t set_frame = (float_t)mhd_data->frame; + float_t set_frame = (float_t)list->frame; v16.enable = true; - v16.frame = rob_chr->data.motion.frame_data.frame - set_frame; - v16.transition_frame = rob_chr->data.motion.frame_data.frame - set_frame; - v16.motion_id = rob_chr->data.motion.motion_id; + v16.frame = rob_chr->rob_base.robmot.frame.f - set_frame; + v16.transition_frame = rob_chr->rob_base.robmot.frame.f - set_frame; + v16.motnum = rob_chr->rob_base.robmot.num; v16.set_frame = set_frame; - v16.transition_duration = (float_t)((int32_t*)data)[0]; + v16.transition_duration = (float_t)((int32_t*)ppadr)[0]; v16.type = type; - v16.cycle_type = ((int8_t*)data)[7]; - v16.ignore_gravity = !!((uint8_t*)data)[6]; - v16.ex_force.x = ((float_t*)data)[2]; - v16.ex_force.y = ((float_t*)data)[3]; - v16.ex_force.z = ((float_t*)data)[4]; - v16.ex_force_cycle_strength.x = ((float_t*)data)[5]; - v16.ex_force_cycle_strength.y = ((float_t*)data)[6]; - v16.ex_force_cycle_strength.z = ((float_t*)data)[7]; - v16.ex_force_cycle.x = ((float_t*)data)[8]; - v16.ex_force_cycle.y = ((float_t*)data)[9]; - v16.ex_force_cycle.z = ((float_t*)data)[10]; - v16.cycle = ((float_t*)data)[11]; - v16.force = ((float_t*)data)[13]; - v16.phase = ((float_t*)data)[12]; - v16.strength = ((float_t*)data)[14]; - v16.strength_transition = (float_t)((int32_t*)data)[15]; + v16.cycle_type = ((int8_t*)ppadr)[7]; + v16.ignore_gravity = !!((uint8_t*)ppadr)[6]; + v16.ex_force.x = ((float_t*)ppadr)[2]; + v16.ex_force.y = ((float_t*)ppadr)[3]; + v16.ex_force.z = ((float_t*)ppadr)[4]; + v16.ex_force_cycle_strength.x = ((float_t*)ppadr)[5]; + v16.ex_force_cycle_strength.y = ((float_t*)ppadr)[6]; + v16.ex_force_cycle_strength.z = ((float_t*)ppadr)[7]; + v16.ex_force_cycle.x = ((float_t*)ppadr)[8]; + v16.ex_force_cycle.y = ((float_t*)ppadr)[9]; + v16.ex_force_cycle.z = ((float_t*)ppadr)[10]; + v16.cycle = ((float_t*)ppadr)[11]; + v16.force = ((float_t*)ppadr)[13]; + v16.phase = ((float_t*)ppadr)[12]; + v16.strength = ((float_t*)ppadr)[14]; + v16.strength_transition = (float_t)((int32_t*)ppadr)[15]; } - rob_chara_set_parts_adjust_by_index(rob_chr, (rob_osage_parts)((uint8_t*)data)[4], &v16); + rob_chara_set_parts_adjust_by_index(rob_chr, (rob_osage_parts)((uint8_t*)ppadr)[4], &v16); } -static void mothead_func_63(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_63( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { } -static void mothead_func_64_osage_reset(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_osage_reset(); +void RobMhPp::func_64_osage_reset( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_osage_reset(); } -static void mothead_func_65_motion_skin_param(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara* rob_chr = func_data->rob_chr; - uint32_t motion_id = rob_chr->data.motion.motion_id; - float_t _frame = (float_t)mhd_data->frame; - rob_chr->set_motion_skin_param(motion_id, _frame); - rob_chr->set_motion_reset_data(motion_id, _frame); +void RobMhPp::func_65_motion_skin_param( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara* rob_chr = impl; + uint32_t motnum = rob_chr->rob_base.robmot.num; + float_t _frame = (float_t)list->frame; + rob_chr->set_motion_skin_param(motnum, _frame); + rob_chr->set_motion_reset_data(motnum, _frame); } -static void mothead_func_66_osage_step(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_osage_step(((float_t*)data)[0]); +void RobMhPp::func_66_osage_step( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_osage_step(((float_t*)ppadr)[0]); } -static void mothead_func_67_sleeve_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_67_sleeve_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { bool v5 = false; bool v6 = false; - switch (((int32_t*)data)[0]) { + switch (((int32_t*)ppadr)[0]) { case 0: v6 = true; break; @@ -6609,76 +7222,76 @@ static void mothead_func_67_sleeve_adjust(mothead_func_data* func_data, break; } - rob_chara_bone_data* rob_bone_data = func_data->rob_chr->bone_data; + rob_chara_bone_data* rob_bone_data = impl->bone_data; rob_bone_data->sleeve_adjust.enable1 = v6; rob_bone_data->sleeve_adjust.enable2 = v5; - rob_bone_data->sleeve_adjust.radius = ((float_t*)data)[1]; + rob_bone_data->sleeve_adjust.radius = ((float_t*)ppadr)[1]; } -static void mothead_func_68(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - motion_blend_mot* mot = func_data->rob_chr->bone_data->motion_loaded.front(); +void RobMhPp::func_68( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + motion_blend_mot* mot = impl->bone_data->motion_loaded.front(); mot->mot_key_data.frame = -1.0f; - mot->mot_key_data.field_68.field_0 = ((int32_t*)data)[0]; - mot->mot_key_data.field_68.field_4 = ((float_t*)data)[1]; + mot->mot_key_data.field_68.field_0 = ((int32_t*)ppadr)[0]; + mot->mot_key_data.field_68.field_4 = ((float_t*)ppadr)[1]; } -static void mothead_func_69_motion_max_frame(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - float_t max_frame = (float_t)*(int32_t*)data; - func_data->rob_chr->bone_data->set_motion_max_frame(max_frame); +void RobMhPp::func_69_motion_max_frame( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + float_t max_frame = (float_t)*(int32_t*)ppadr; + impl->bone_data->set_motion_max_frame(max_frame); /*pv_game* v6 = pv_game_get(); if (v6) - pv_game::set_data_itmpv_max_frame(v6, func_data->rob_chr->chara_id, max_frame);*/ + pv_game::set_data_itmpv_max_frame(v6, impl->idnm, max_frame);*/ } -static void mothead_func_70_camera_max_frame(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { +void RobMhPp::func_70_camera_max_frame( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { /*pv_game* v5 = pv_game_data_get(); if (!v5) return; - int32_t v6 = v5->data.camera_auth_3d_uid; + int32_t v6 = v5->ppadr.camera_auth_3d_uid; if (v6 == -1) return; int32_t id; pv_game::get_data_auth_3d(v5, &id, v6); if (auth_3d_data_check_id_not_empty(&id)) - auth_3d_data_set_max_frame(&id, (float_t)((int32_t*)data)[0]);*/ + auth_3d_data_set_max_frame(&id, (float_t)((int32_t*)ppadr)[0]);*/ } -static void mothead_func_71_osage_move_cancel(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_osage_move_cancel(((uint8_t*)data)[0], ((float_t*)data)[1]); +void RobMhPp::func_71_osage_move_cancel( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_osage_move_cancel(((uint8_t*)ppadr)[0], ((float_t*)ppadr)[1]); } -static void mothead_func_72(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara_adjust_data* v6 = &func_data->rob_chr->data.adjust_data; - v6->offset.x = ((float_t*)data)[0]; - v6->offset.y = ((float_t*)data)[1]; - v6->offset.z = ((float_t*)data)[2]; - v6->offset_x = !!((uint8_t*)data)[24]; - v6->offset_y = !!((uint8_t*)data)[25]; - v6->offset_z = !!((uint8_t*)data)[26]; +void RobMhPp::func_72( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + RobAdjust* v6 = &impl->rob_base.adjust; + v6->offset.x = ((float_t*)ppadr)[0]; + v6->offset.y = ((float_t*)ppadr)[1]; + v6->offset.z = ((float_t*)ppadr)[2]; + v6->offset_x = !!((uint8_t*)ppadr)[24]; + v6->offset_y = !!((uint8_t*)ppadr)[25]; + v6->offset_z = !!((uint8_t*)ppadr)[26]; } -static void mothead_func_73_rob_hand_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara_motion* v4 = &func_data->rob_chr->data.motion; - int32_t hand = ((int16_t*)data)[0]; +void RobMhPp::func_73_rob_hand_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + RobMotion& motion = impl->rob_base.robmot; + int32_t hand = ((int16_t*)ppadr)[0]; - rob_chara_data_hand_adjust* hand_adjust = &v4->hand_adjust[hand]; - rob_chara_data_hand_adjust* hand_adjust_prev = &v4->hand_adjust_prev[hand]; + rob_chara_data_hand_adjust* hand_adjust = &motion.hand_adjust[hand]; + rob_chara_data_hand_adjust* hand_adjust_prev = &motion.hand_adjust_prev[hand]; *hand_adjust_prev = *hand_adjust; hand_adjust->reset(); - hand_adjust->scale_select = ((int16_t*)data)[1]; - hand_adjust->duration = ((float_t*)data)[1]; - hand_adjust->type = (rob_chara_data_hand_adjust_type)((int16_t*)data)[4]; - hand_adjust->scale = ((float_t*)data)[3]; - hand_adjust->current_time = v4->frame_data.frame - (float_t)mhd_data->frame; + hand_adjust->scale_select = ((int16_t*)ppadr)[1]; + hand_adjust->duration = ((float_t*)ppadr)[1]; + hand_adjust->type = (rob_chara_data_hand_adjust_type)((int16_t*)ppadr)[4]; + hand_adjust->scale = ((float_t*)ppadr)[3]; + hand_adjust->current_time = motion.frame.f - (float_t)list->frame; switch (hand_adjust->scale_select) { case 0: @@ -6691,140 +7304,132 @@ static void mothead_func_73_rob_hand_adjust(mothead_func_data* func_data, hand_adjust->disable_y = hand_adjust_prev->disable_y; hand_adjust->disable_z = hand_adjust_prev->disable_z; hand_adjust->arm_length = hand_adjust_prev->arm_length; - hand_adjust->iterations = hand_adjust_prev->iterations; + hand_adjust->init_cnt = hand_adjust_prev->init_cnt; break; case 1: hand_adjust->enable = true; - hand_adjust->rotation_blend = ((float_t*)data)[4]; - hand_adjust->offset.x = ((float_t*)data)[5]; - hand_adjust->offset.y = ((float_t*)data)[6]; - hand_adjust->offset.z = ((float_t*)data)[7]; - hand_adjust->enable_scale = !!((uint8_t*)data)[32]; - hand_adjust->disable_x = !!((uint8_t*)data)[33]; - hand_adjust->disable_y = !!((uint8_t*)data)[34]; - hand_adjust->disable_z = !!((uint8_t*)data)[35]; - hand_adjust->scale_blend = ((float_t*)data)[9]; - hand_adjust->arm_length = ((float_t*)data)[10]; - hand_adjust->iterations = ((int32_t*)data)[11]; + hand_adjust->rotation_blend = ((float_t*)ppadr)[4]; + hand_adjust->offset.x = ((float_t*)ppadr)[5]; + hand_adjust->offset.y = ((float_t*)ppadr)[6]; + hand_adjust->offset.z = ((float_t*)ppadr)[7]; + hand_adjust->enable_scale = !!((uint8_t*)ppadr)[32]; + hand_adjust->disable_x = !!((uint8_t*)ppadr)[33]; + hand_adjust->disable_y = !!((uint8_t*)ppadr)[34]; + hand_adjust->disable_z = !!((uint8_t*)ppadr)[35]; + hand_adjust->scale_blend = ((float_t*)ppadr)[9]; + hand_adjust->arm_length = ((float_t*)ppadr)[10]; + hand_adjust->init_cnt = ((int32_t*)ppadr)[11]; break; } } -static void mothead_func_74_disable_collision(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->set_disable_collision((rob_osage_parts)((uint8_t*)data)[0], !!((uint8_t*)data)[1]); +void RobMhPp::func_74_disable_collision( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->set_disable_collision((rob_osage_parts)((uint8_t*)ppadr)[0], !!((uint8_t*)ppadr)[1]); } static void rob_chara_set_adjust_global(rob_chara* rob_chr, rob_chara_data_adjust* a2) { rob_chara_set_adjust(rob_chr, a2, - &rob_chr->data.motion.adjust_global, &rob_chr->data.motion.adjust_global_prev); + &rob_chr->rob_base.robmot.adjust_global, &rob_chr->rob_base.robmot.adjust_global_prev); } -static void mothead_func_75_rob_adjust_global(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara* rob_chr = func_data->rob_chr; +void RobMhPp::func_75_rob_adjust_global( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara* rob_chr = impl; rob_chara_data_adjust v14; v14.reset(); - int8_t type = ((int8_t*)data)[4]; + int8_t type = ((int8_t*)ppadr)[4]; if (type >= 0 && type < 6) { - float_t set_frame = (float_t)mhd_data->frame; + float_t set_frame = (float_t)list->frame; v14.enable = true; - v14.frame = rob_chr->data.motion.frame_data.frame - set_frame; - v14.transition_frame = rob_chr->data.motion.frame_data.frame - set_frame; - v14.motion_id = rob_chr->data.motion.motion_id; + v14.frame = rob_chr->rob_base.robmot.frame.f - set_frame; + v14.transition_frame = rob_chr->rob_base.robmot.frame.f - set_frame; + v14.motnum = rob_chr->rob_base.robmot.num; v14.set_frame = set_frame; - v14.transition_duration = (float_t)((int32_t*)data)[0]; + v14.transition_duration = (float_t)((int32_t*)ppadr)[0]; v14.type = type; - v14.cycle_type = ((int8_t*)data)[5]; - v14.ex_force.x = ((float_t*)data)[2]; - v14.ex_force.y = ((float_t*)data)[3]; - v14.ex_force.z = ((float_t*)data)[4]; - v14.ex_force_cycle_strength.x = ((float_t*)data)[5]; - v14.ex_force_cycle_strength.y = ((float_t*)data)[6]; - v14.ex_force_cycle_strength.z = ((float_t*)data)[7]; - v14.ex_force_cycle.x = ((float_t*)data)[8]; - v14.ex_force_cycle.y = ((float_t*)data)[9]; - v14.ex_force_cycle.z = ((float_t*)data)[10]; - v14.cycle = ((float_t*)data)[11]; - v14.phase = ((float_t*)data)[12]; + v14.cycle_type = ((int8_t*)ppadr)[5]; + v14.ex_force.x = ((float_t*)ppadr)[2]; + v14.ex_force.y = ((float_t*)ppadr)[3]; + v14.ex_force.z = ((float_t*)ppadr)[4]; + v14.ex_force_cycle_strength.x = ((float_t*)ppadr)[5]; + v14.ex_force_cycle_strength.y = ((float_t*)ppadr)[6]; + v14.ex_force_cycle_strength.z = ((float_t*)ppadr)[7]; + v14.ex_force_cycle.x = ((float_t*)ppadr)[8]; + v14.ex_force_cycle.y = ((float_t*)ppadr)[9]; + v14.ex_force_cycle.z = ((float_t*)ppadr)[10]; + v14.cycle = ((float_t*)ppadr)[11]; + v14.phase = ((float_t*)ppadr)[12]; } rob_chara_set_adjust_global(rob_chr, &v14); } -static void mothead_func_76_rob_arm_adjust(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara* rob_chr = func_data->rob_chr; +void RobMhPp::func_76_rob_arm_adjust( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara* rob_chr = impl; - rob_chara_data_arm_adjust* arm_adjust = &rob_chr->data.motion.arm_adjust[((int16_t*)data)[0]]; + rob_chara_data_arm_adjust* arm_adjust = &rob_chr->rob_base.robmot.arm_adjust[((int16_t*)ppadr)[0]]; arm_adjust->enable = true; arm_adjust->prev_value = arm_adjust->value; arm_adjust->value = 0.0f; - arm_adjust->next_value = ((float_t*)data)[2]; - arm_adjust->duration = ((float_t*)data)[1]; + arm_adjust->next_value = ((float_t*)ppadr)[2]; + arm_adjust->duration = ((float_t*)ppadr)[1]; } -static void mothead_func_77_disable_eye_motion(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_chr->bone_data->set_disable_eye_motion(((uint8_t*)data)[0] != 0); +void RobMhPp::func_77_disable_eye_motion( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + impl->bone_data->set_disable_eye_motion(((uint8_t*)ppadr)[0] != 0); } -static void mothead_func_78(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - static const int16_t word_140A2D430[] = { - 1, 0, 3, 2, 4, 0, 0, 0 - }; +void RobMhPp::func_78( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + RobBase* rob_base = base; + uint16_t part = ((uint8_t*)ppadr)[2]; + if (rob_base->robmot.flag.bit.mirror) + part = leaf_ctrl_part_mirror_tbl[part]; - rob_chara_data* rob_base = func_data->rob_base; - uint16_t v5 = ((uint8_t*)data)[2]; - if (rob_base->motion.field_28 & 0x08) - v5 = word_140A2D430[v5]; + MotLeafCtrl& leaf_ctrl = rob_base->motdata.leaf_ctrl[part]; + float_t v12 = leaf_ctrl.field_34.x; + float_t v8 = leaf_ctrl.field_34.y; + float_t v9 = leaf_ctrl.field_34.z; + float_t v10 = leaf_ctrl.field_40.x; + float_t v13 = leaf_ctrl.field_40.y; + float_t v11 = leaf_ctrl.field_40.z; - struc_306* v7 = &rob_base->motdata.field_330.field_33C[v5]; - int32_t v8 = v7->field_38; - int32_t v9 = v7->field_3C; - int32_t v10 = v7->field_40; - int32_t v11 = v7->field_48; + leaf_ctrl.mode = -1; + leaf_ctrl.start_frame = -1.0f; + leaf_ctrl.end_frame = -1.0f; + leaf_ctrl.target_id = 0; + leaf_ctrl.limit = 0; - v7->field_0 = -1; - v7->frame = -1.0f; - v7->field_8 = -1.0f; - v7->field_C = 0; - v7->field_E = 0; + leaf_ctrl.ofs = 0.0f; + leaf_ctrl.min = 0.0f; + leaf_ctrl.max = 0.0f; + leaf_ctrl.field_34 = 0.0f; + leaf_ctrl.field_40 = 0.0f; - int32_t v12 = v7->field_34; - int32_t v13 = v7->field_44; - v7->field_10 = 0.0f; - v7->field_1C = 0.0f; - v7->field_28 = 0.0f; - v7->field_38 = 0; - v7->field_34 = 0; - v7->field_3C = 0; - v7->field_40 = 0; - v7->field_44 = 0; - v7->field_48 = 0; - - uint8_t v14 = ((uint8_t*)data)[3]; - if (v14 != 1) { - v12 = ((int32_t*)data)[1]; - v8 = ((int32_t*)data)[2]; - v9 = ((int32_t*)data)[3]; - v10 = ((int32_t*)data)[4]; - v13 = ((int32_t*)data)[5]; - v11 = ((int32_t*)data)[6]; + uint8_t mode = ((uint8_t*)ppadr)[3]; + if (mode != LEAF_CTRL_OFF) { + v12 = ((float_t*)ppadr)[1]; + v8 = ((float_t*)ppadr)[2]; + v9 = ((float_t*)ppadr)[3]; + v10 = ((float_t*)ppadr)[4]; + v13 = ((float_t*)ppadr)[5]; + v11 = ((float_t*)ppadr)[6]; } - v7->field_0 = v14; - v7->frame = (float_t)mhd_data->frame; - v7->field_8 = (float_t)((int16_t*)data)[1]; - v7->field_C = 26; - v7->field_34 = v12; - v7->field_38 = v8; - v7->field_3C = v9; - v7->field_40 = v10; - v7->field_44 = v13; - v7->field_48 = v11; + leaf_ctrl.mode = mode; + leaf_ctrl.start_frame = (float_t)list->frame; + leaf_ctrl.end_frame = (float_t)((int16_t*)ppadr)[1]; + leaf_ctrl.target_id = 26; + leaf_ctrl.field_34.x = v12; + leaf_ctrl.field_34.y = v8; + leaf_ctrl.field_34.z = v9; + leaf_ctrl.field_40.x = v10; + leaf_ctrl.field_40.y = v13; + leaf_ctrl.field_40.z = v11; } static void rob_chara_set_coli_ring(rob_chara* rob_chr, int32_t mhd_id) { @@ -6836,41 +7441,45 @@ static void rob_chara_set_coli_ring(rob_chara* rob_chr, int32_t mhd_id) { if (stage_index != -1) stage_param_data_coli_data_get_stage_index_data(stage_index, &ring); } - rob_chara_item_equip_set_ring(rob_chr->rob_disp, ring); + RobDisp_set_ring(rob_chr->disp, ring); } -static void mothead_func_79_rob_chara_coli_ring(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - rob_chara_set_coli_ring(func_data->rob_chr, ((int8_t*)data)[0]); +void RobMhPp::func_79_rob_chara_coli_ring( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + rob_chara_set_coli_ring(impl, ((int8_t*)ppadr)[0]); } -static void mothead_func_80_adjust_get_global_pos(mothead_func_data* func_data, - const void* data, const mothead_data* mhd_data, int32_t frame, const motion_database* mot_db) { - func_data->rob_base->adjust_data.get_global_pos = ((uint8_t*)data)[0]; +void RobMhPp::func_80_adjust_get_global_pos( + const void* ppadr, MhpList* list, int32_t frame, const motion_database* mot_db) { + base->adjust.get_global_pos = ((uint8_t*)ppadr)[0]; } -static void mothead_mot_func_0(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - if (func_data->field_10->field_0.field_58 != -1) +// 0x140536D30 +void RobMhSmd::exec_func(int32_t type, MhdList* list) { + (this->*functbl[type])(list->data, list); +} + +void RobMhSmd::smd_next(const void* mhadr, MhdList* list) { + if (motd->next_type != MH_NEXT_NONE) return; std::list> v23; uint32_t v8 = 0; - if (!mhd_mot_data) + if (!list) return; - bool v9 = mhd_mot_data->type == 0; - if (mhd_mot_data->type < 0) + bool v9 = list->type == 0; + if (list->type < 0) return; while (!v9) { - mhd_mot_data++; - v9 = mhd_mot_data->type == 0; - if (mhd_mot_data->type < 0) + list++; + v9 = list->type == 0; + if (list->type < 0) return; } - const void* v10 = mhd_mot_data->data; + const void* v10 = list->data; if (!v10) return; @@ -6878,13 +7487,13 @@ LABEL_8: v8 += ((uint16_t*)v10)[11]; v23.push_back({ v10, v8 }); - if (mhd_mot_data) { - const mothead_mot_data* v13 = mhd_mot_data + 1; + if (list) { + MhdList* v13 = list + 1; bool v9 = v13 == 0; if (!v9) { while (v13->type >= 0) { if (!v13->type) { - mhd_mot_data = v13; + list = v13; v10 = v13->data; if (v10) goto LABEL_8; @@ -6902,406 +7511,334 @@ LABEL_8: uint32_t v15 = rand_state_array_get_int(1) % v8; for (const std::pair& i : v23) if (v15 < i.second) { - data = i.first; + mhadr = i.first; break; } } v23.clear(); - struc_223* v19 = func_data->field_10; - v19->field_0.field_58 = ((int16_t*)data)[0]; - v19->field_0.field_5C = ((int32_t*)data)[1]; - v19->field_0.field_60 = ((int32_t*)data)[2]; - v19->field_0.field_64 = ((int32_t*)data)[3]; - v19->field_0.field_68 = ((int32_t*)data)[4]; - v19->field_0.loop_count = ((int16_t*)data)[10]; - v19->field_0.loop_begin = (float_t)((int16_t*)data)[12]; - v19->field_0.loop_end = (float_t)((int16_t*)data)[13]; + RobMotData* v19 = motd; + v19->next_type = (MhNextType)((int16_t*)mhadr)[0]; + v19->next.set(((uint32_t*)mhadr)[1], ((uint32_t*)mhadr)[2]); + v19->next_end.set(((int32_t*)mhadr)[3], ((int32_t*)mhadr)[4]); + v19->next_limit = ((int16_t*)mhadr)[10]; + v19->loop_begin = (float_t)((int16_t*)mhadr)[12]; + v19->loop_end = (float_t)((int16_t*)mhadr)[13]; } -static void mothead_mot_func_1(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - func_data->field_10->field_0.field_78 = (float_t)((int16_t*)data)[0]; - if (((int16_t*)data)[1] >= 0) - func_data->field_10->field_0.field_7C = (float_t)((int16_t*)data)[1]; - if (((int16_t*)data)[2] >= 0) - func_data->field_10->field_0.field_80 = (float_t)((int16_t*)data)[2]; - func_data->field_10->field_0.field_20.field_0 |= 0x02; - func_data->rob_base->motion.field_24 = 0; +void RobMhSmd::func_1(const void* mhadr, MhdList* list) { + motd->main_mot_frame = (float_t)((int16_t*)mhadr)[0]; + if (((int16_t*)mhadr)[1] >= 0) + motd->follow1_frame = (float_t)((int16_t*)mhadr)[1]; + if (((int16_t*)mhadr)[2] >= 0) + motd->follow2_frame = (float_t)((int16_t*)mhadr)[2]; + motd->motkind.set(MK_BEGIN); + base->robmot.basic_step = BSTEP_BEGIN; } -static void mothead_mot_func_2(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - func_data->field_10->field_0.field_1E8 = ((int32_t*)data)[0]; - func_data->field_10->field_0.field_1EC = (float_t)((int16_t*)data)[2]; - func_data->field_10->field_0.field_1F0 = (float_t)((int16_t*)data)[3]; - func_data->field_10->field_0.field_1F4 = (float_t)((int16_t*)data)[4]; - func_data->field_10->field_0.field_1F8 = (float_t)((int16_t*)data)[5]; - func_data->field_10->field_0.field_1FC = ((float_t*)data)[3]; - func_data->field_10->field_0.field_200 += ((float_t*)data)[4]; - func_data->rob_base->action.field_B8.field_10.y = -(get_gravity() * ((float_t*)data)[4]); +void RobMhSmd::func_2(const void* mhadr, MhdList* list) { + motd->air_kind.init(&((uint32_t*)mhadr)[0]); + motd->jump_frame = (float_t)((int16_t*)mhadr)[2]; + motd->stop_frame = (float_t)((int16_t*)mhadr)[3]; + motd->land_frame = (float_t)((int16_t*)mhadr)[4]; + motd->ev_land_frame = (float_t)((int16_t*)mhadr)[5]; + motd->land_ypos = ((float_t*)mhadr)[3]; + motd->gravity += ((float_t*)mhadr)[4]; + base->action.yarare.efc_spd.y = -(get_gravity() * ((float_t*)mhadr)[4]); - if (func_data->field_10->field_0.field_1F4 < func_data->field_10->field_0.field_1F0) - func_data->field_10->field_0.field_1F4 = func_data->field_10->field_0.field_1F0; + if (motd->land_frame < motd->stop_frame) + motd->land_frame = motd->stop_frame; } -static void mothead_mot_func_3(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_3(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_4(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_4(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_5(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_5(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_6(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_6(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_7(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_7(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_8(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_8(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_9(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_9(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_10(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_10(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_11(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_11(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_12(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_12(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_13(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_13(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_14(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_14(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_15(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_15(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_16(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_16(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_17(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_17(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_18(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_18(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_19(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_19(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_20(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_20(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_21(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_21(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_22(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_22(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_23(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_23(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_24(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_24(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_25(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_25(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_26(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_26(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_27(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_27(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_28(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_28(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_29(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_29(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_30(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_30(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_31(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_31(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_32(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_32(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_33(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_33(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_34(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_34(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_35(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_35(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_36(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_36(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_37(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_37(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_38(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_38(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_39(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_39(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_40(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - func_data->field_10->field_0.field_238 = ((int16_t*)data)[0]; - if (func_data->rob_base->motion.field_28 & 0x08) - func_data->field_10->field_0.field_23C = -((float_t*)data)[1]; +void RobMhSmd::func_40(const void* mhadr, MhdList* list) { + motd->tag_jumph = ((int16_t*)mhadr)[0]; + if (base->robmot.flag.bit.mirror) + motd->tag_xofs = -((float_t*)mhadr)[1]; else - func_data->field_10->field_0.field_23C = ((float_t*)data)[1]; - func_data->field_10->field_0.field_240 = ((int32_t*)data)[2]; - func_data->rob_base->action.field_B8.field_10.y = -(get_gravity() * ((float_t*)data)[3]); + motd->tag_xofs = ((float_t*)mhadr)[1]; + motd->tag_zofs = ((float_t*)mhadr)[2]; + base->action.yarare.efc_spd.y = -(get_gravity() * ((float_t*)mhadr)[3]); } -static void mothead_mot_func_41(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - if (func_data->field_10->field_0.field_244 <= 0) - func_data->field_10->field_0.field_248 = mhd_mot_data; - func_data->field_10->field_0.field_244++; +void RobMhSmd::smd_shift(const void* mhadr, MhdList* list) { + if (motd->shift_num <= 0) + motd->shift_adr = list; + motd->shift_num++; } -static void mothead_mot_func_42(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_42(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_43(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_43(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_44(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_44(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_45(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_45(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_46(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - if (func_data->field_10->field_0.field_10.field_0 & 0x100) - if (func_data->rob_base->motion.field_28 & 0x08) - func_data->field_10->field_0.field_274 = -((int16_t*)data)[0]; +void RobMhSmd::func_46(const void* mhadr, MhdList* list) { + if (motd->motkind_fix[MK_TURN]) + if (base->robmot.flag.bit.mirror) + motd->mov_yang = -((int16_t*)mhadr)[0]; else - func_data->field_10->field_0.field_274 = ((int16_t*)data)[0]; + motd->mov_yang = ((int16_t*)mhadr)[0]; } -static void mothead_mot_func_47(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_47(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_48(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_48(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_49(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_49(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_50(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_50(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_51(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - if (func_data->rob_base->motion.field_28 & 0x08) - func_data->field_10->field_0.field_2B8 = -((int16_t*)data)[0]; +void RobMhSmd::func_51(const void* mhadr, MhdList* list) { + if (base->robmot.flag.bit.mirror) + motd->dturn_yang = -((int16_t*)mhadr)[0]; else - func_data->field_10->field_0.field_2B8 = ((int16_t*)data)[0]; + motd->dturn_yang = ((int16_t*)mhadr)[0]; } -static void mothead_mot_func_52(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_52(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_53(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_53(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_54(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_54(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_55(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - func_data->field_10->field_0.field_2BC = ((int32_t*)data)[0]; - func_data->field_10->field_0.field_2C0 = ((float_t*)data)[1]; - func_data->field_10->field_0.field_2C4 = ((float_t*)data)[2]; +void RobMhSmd::func_55(const void* mhadr, MhdList* list) { + motd->smooth_flag.init(&((uint32_t*)mhadr)[0]); + motd->smooth_f_length = ((float_t*)mhadr)[1]; + motd->smooth_r_length = ((float_t*)mhadr)[2]; } -static void mothead_mot_func_56(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_56(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_57(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_57(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_58(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_58(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_59(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_59(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_60(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_60(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_61(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_61(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_62(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_62(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_63(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_63(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_64(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_64(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_65(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - if (func_data->rob_base->motion.field_28 & 0x08) - func_data->field_10->field_0.field_318.x = -((float_t*)data)[0]; +void RobMhSmd::func_65(const void* mhadr, MhdList* list) { + if (base->robmot.flag.bit.mirror) + motd->trans_xofs = -((float_t*)mhadr)[0]; else - func_data->field_10->field_0.field_318.x = ((float_t*)data)[0]; - func_data->field_10->field_0.field_318.y = ((float_t*)data)[1]; - func_data->field_10->field_0.field_318.z = ((float_t*)data)[2]; + motd->trans_xofs = ((float_t*)mhadr)[0]; + motd->trans_yofs = ((float_t*)mhadr)[1]; + motd->trans_zofs = ((float_t*)mhadr)[2]; } -static void mothead_mot_func_66(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - func_data->field_10->field_0.field_324 = *(float_t*)data; - - float_t v4 = func_data->field_10->field_0.field_324; - if (v4 < 0.0f) - func_data->field_10->field_0.field_324 = v4 * -1.0f; +void RobMhSmd::func_66(const void* mhadr, MhdList* list) { + motd->jump_zspd = *(float_t*)mhadr; + if (motd->jump_zspd < 0.0f) + motd->jump_zspd *= -1.0f; } -static void mothead_mot_func_67(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { +void RobMhSmd::func_67(const void* mhadr, MhdList* list) { } -static void mothead_mot_func_68(mothead_mot_func_data* func_data, - const void* data, const mothead_mot_data* mhd_mot_data) { - int32_t iterations = *(int32_t*)data; - if (iterations > 0) - func_data->field_10->field_0.iterations = iterations; +void RobMhSmd::func_68(const void* mhadr, MhdList* list) { + int32_t init_cnt = *(int32_t*)mhadr; + if (init_cnt > 0) + motd->init_cnt = init_cnt; } static int16_t opd_data_encode_shift(float_t value, uint32_t shift) { @@ -7583,109 +8120,108 @@ static void opd_encode_data(const std::vector& src, uint8_t*& dst, size dst_size = sizeof(osage_play_data_node_header) + sizeof(int16_t) * count; } -static PvOsageManager* pv_osage_manager_array_get(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) - chara_id = 0; - return &pv_osage_manager_array[chara_id]; +static PvOsageManager* pv_osage_manager_array_get(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) + rob_id = ROB_ID_1P; + return &pv_osage_manager_array[rob_id]; } static void rob_base_rob_chara_init(rob_chara* rob_chr) { //sub_14054F4A0(&rob_chr->rob_touch); - //sub_14054F830(&rob_chr->rob_touch, rob_chr->pv_data.field_70 != 0); + //sub_14054F830(&rob_chr->rob_touch, rob_chr->rob_init.field_70 != 0); } static mat4* sub_140504E80(rob_chara* rob_chr) { mat4 mat; - mat4_rotate_y(rob_chr->data.position.yang.get_rad(), &mat); - mat4_set_translation(&mat, &rob_chr->data.position.pos); - rob_chr->data.position.rob_mat = mat; - return &rob_chr->data.position.rob_mat; + mat4_rotate_y(rob_chr->rob_base.position.yang.get_rad(), &mat); + mat4_set_translation(&mat, &rob_chr->rob_base.position.pos); + rob_chr->rob_base.position.rob_mat = mat; + return &rob_chr->rob_base.position.rob_mat; } -static void sub_140414900(struc_308* a1, const mat4* mat) { +static void sub_140414900(MotionSmooth* a1, const mat4* mat) { if (mat) { - a1->field_8C = true; - a1->mat = *mat; + a1->base_mtx_set = true; + a1->base_mtx = *mat; } else { - a1->field_8C = false; - a1->mat = mat4_identity; + a1->base_mtx_set = false; + a1->base_mtx = mat4_identity; } } static void sub_14041DA50(rob_chara_bone_data* rob_bone_data, mat4* mat) { - for (RobNode& i : rob_bone_data->nodes) + for (RobNode& i : rob_bone_data->node_vec) mat4_mul(i.mat_ptr, mat, i.mat_ptr); - sub_140414900(&rob_bone_data->motion_loaded.front()->field_4F8, mat); + sub_140414900(&rob_bone_data->motion_loaded.front()->smooth, mat); } static void sub_140507F60(rob_chara* rob_chr) { sub_14041DA50(rob_chr->bone_data, sub_140504E80(rob_chr)); - rob_chr->data.position.old_gpos = rob_chr->data.position.gpos; + rob_chr->rob_base.position.old_gpos = rob_chr->rob_base.position.gpos; mat4* n_hara_mat = rob_chr->bone_data->get_mats_mat(BONE_ID_N_HARA); - mat4_get_translation(n_hara_mat, &rob_chr->data.position.gpos); - rob_chr->data.position.velocity = rob_chr->data.position.gpos - - rob_chr->data.position.old_gpos; + mat4_get_translation(n_hara_mat, &rob_chr->rob_base.position.gpos); + rob_chr->rob_base.position.velocity = rob_chr->rob_base.position.gpos + - rob_chr->rob_base.position.old_gpos; mat4* n_hara_cp_mat = rob_chr->bone_data->get_mats_mat(BONE_ID_N_HARA_CP); vec3 v10 = { 0.0f, 0.0f, 1.0f }; mat4_transform_vector(n_hara_cp_mat, &v10, &v10); - rob_chr->data.position.hara_yang.set_rad(atan2f(v10.x, v10.z)); + rob_chr->rob_base.position.hara_yang.set_rad(atan2f(v10.x, v10.z)); } static void sub_140505B20(rob_chara* rob_chr) { - if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x100) - rob_chr->data.position.act_yang = rob_chr->data.position.yang + rob_chr->data.motdata.field_0.field_274; + if (rob_chr->rob_base.motdata.motkind[MK_TURN]) + rob_chr->rob_base.position.act_yang = rob_chr->rob_base.position.yang + rob_chr->rob_base.motdata.mov_yang; else - rob_chr->data.position.act_yang = rob_chr->data.position.yang; + rob_chr->rob_base.position.act_yang = rob_chr->rob_base.position.yang; - if (rob_chr->data.flag.bit.fix_hara && rob_chr->data.position.spd.y > -0.000001f) - rob_chr->data.flag.bit.jump_rise = 1; + if (rob_chr->rob_base.flag.bit.fix_hara && rob_chr->rob_base.position.spd.y > -0.000001f) + rob_chr->rob_base.flag.bit.jump_rise = 1; else - rob_chr->data.flag.bit.jump_rise = 0; + rob_chr->rob_base.flag.bit.jump_rise = 0; } static void rob_base_rob_chara_ctrl(rob_chara* rob_chr) { sub_140507F60(rob_chr); rob_chr->adjust_ctrl(); sub_140505B20(rob_chr); - //sub_14036D130(7, &rob_chr); - rob_chr->set_data_adjust_mat(&rob_chr->data.adjust_data); + //rob_chara* v2 = rob_chr; + //PostEvent(EVENT_TYPE_ROB_ACTION_FINISH, &v2); + rob_chr->set_data_adjust_mat(&rob_chr->rob_base.adjust); } static void sub_140514680(rob_chara* rob_chr) { - rob_chr->data.action.field_0 = 0; - rob_chr->data.action.field_4 = rob_chr->data.action.field_2C; + rob_chr->rob_base.action.step = 0; + rob_chr->rob_base.action.action = rob_chr->rob_base.action.command; } static void sub_140514540(rob_chara* rob_chr) { - rob_chr->data.action.field_18 = rob_chr->data.action.field_4; - rob_chr->data.action.field_40 = rob_chr->data.action.field_2C; - if (rob_chr->data.action.field_2C.field_0 == 1) + rob_chr->rob_base.action.old_action = rob_chr->rob_base.action.action; + rob_chr->rob_base.action.bak_command = rob_chr->rob_base.action.command; + if (rob_chr->rob_base.action.command.name == ROB_ACT_MOTION) sub_140514680(rob_chr); - rob_chr->data.action.field_2C.field_0 = 0; + rob_chr->rob_base.action.command.name = ROB_ACT_NONE; } static void sub_1405145F0(rob_chara* rob_chr, const bone_database* bone_data, const motion_database* mot_db) { - if (rob_chr->data.action.field_0) + if (rob_chr->rob_base.action.step) return; - float_t frame; - if (!(rob_chr->data.motion.field_28 & 0x80)) - frame = 0.0f; - else - frame = rob_chr->data.motion.frame_data.last_set_frame; - rob_chr->load_motion(rob_chr->data.action.field_4.motion_id, - rob_chr->data.action.field_4.field_10, frame, MOTION_BLEND, bone_data, mot_db); + float_t frame = 0.0f; + if (rob_chr->rob_base.robmot.flag.bit.ext_frame_req) + frame = rob_chr->rob_base.robmot.frame.req_f; + rob_chr->set_rob_motion(rob_chr->rob_base.action.action.motnum, + rob_chr->rob_base.action.action.mirror, frame, MOTION_BLEND, bone_data, mot_db); rob_chr->bone_data->set_motion_blend_duration(0.0f, 1.0f, 1.0f); - rob_chr->set_motion_reset_data(rob_chr->data.action.field_4.motion_id, 0.0f); - rob_chr->data.action.field_0 = 1; + rob_chr->set_motion_reset_data(rob_chr->rob_base.action.action.motnum, 0.0f); + rob_chr->rob_base.action.step = 1; } static void sub_1405144C0(rob_chara* rob_chr, const bone_database* bone_data, const motion_database* mot_db) { - if (rob_chr->data.action.field_4.field_0 == 1) { + if (rob_chr->rob_base.action.action.name == ROB_ACT_MOTION) { pv_expression_array_ctrl(rob_chr); sub_1405145F0(rob_chr, bone_data, mot_db); } @@ -7697,91 +8233,72 @@ static void sub_140514520(rob_chara* rob_chr, const bone_database* bone_data, co } static void sub_14054BC70(RobSubAction* a1) { - if (!a1->data.field_18) + if (!a1->field_20) return; - switch (a1->data.field_18->type) { + switch (a1->field_20->type) { case SUB_ACTION_EXECUTE_CRY: - a1->data.field_0 = &a1->data.cry; + a1->field_8 = &a1->cry; break; case SUB_ACTION_EXECUTE_SHAKE_HAND: - a1->data.field_0 = &a1->data.shake_hand; + a1->field_8 = &a1->shake_hand; break; case SUB_ACTION_EXECUTE_EMBARRASSED: - a1->data.field_0 = &a1->data.embarrassed; + a1->field_8 = &a1->embarrassed; break; case SUB_ACTION_EXECUTE_ANGRY: - a1->data.field_0 = &a1->data.angry; + a1->field_8 = &a1->angry; break; case SUB_ACTION_EXECUTE_LAUGH: - a1->data.field_0 = &a1->data.laugh; + a1->field_8 = &a1->laugh; break; case SUB_ACTION_EXECUTE_COUNT_NUM: - a1->data.field_0 = &a1->data.count_num; + a1->field_8 = &a1->count_num; break; default: - a1->data.field_0 = 0; + a1->field_8 = 0; break; } - if (a1->data.field_0) - a1->data.field_0->Field_10(a1->data.param); + if (a1->field_8) + a1->field_8->set(a1->param); - if (a1->data.field_18) - delete a1->data.field_18; - a1->data.field_18 = 0; + if (a1->field_20) + delete a1->field_20; + a1->field_20 = 0; } static void sub_14054CC80(rob_chara* a1) { - sub_14054BC70(&a1->data.rob_sub_action); - if (a1->data.rob_sub_action.data.field_0) { - a1->data.rob_sub_action.data.field_0->Field_18(a1); - a1->data.rob_sub_action.data.field_0 = 0; + sub_14054BC70(&a1->rob_base.sub_action); + if (a1->rob_base.sub_action.field_8) { + a1->rob_base.sub_action.field_8->Field_18(a1); + a1->rob_base.sub_action.field_8 = 0; } - if (a1->data.rob_sub_action.data.field_8) - a1->data.rob_sub_action.data.field_8->Field_20(a1); + if (a1->rob_base.sub_action.field_10) + a1->rob_base.sub_action.field_10->Field_20(a1); } -static uint64_t sub_1405054E0(uint32_t a1) { - uint64_t v1 = a1; - v1 = (((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555)) & 0x33333333) - + ((((v1 & 0x55555555) + ((v1 >> 1) & 0x55555555u)) >> 2) & 0x33333333); - return (((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) & 0xFF00FF) - + ((((v1 & 0xF0F0F0F) + ((v1 >> 4) & 0xF0F0F0F)) >> 8) & 0xFF00FF)) >> 16) - + (((v1 & 0xF) + ((v1 >> 4) & 0xF)) + (((v1 & 0xF0F) + ((v1 >> 4) & 0xF0F)) >> 8)); -} - -static bool sub_14054F930(uint32_t a1, uint32_t* a2) { - size_t v2 = 0; - while (a1 == *a2) { - v2++; - a2++; - if (v2) - return true; - } - return false; -} - -static const void* sub_140551F60(rob_chara* rob_chr, uint32_t* a2) { - int16_t v2 = rob_chr->data.motdata.field_0.field_244; - const mothead_mot_data* v3 = rob_chr->data.motdata.field_0.field_248; +static const void* sub_140551F60(rob_chara* rob_chr, const prj::BitArray<23>& shift_req) { + int16_t v2 = rob_chr->rob_base.motdata.shift_num; + MhdList* v3 = rob_chr->rob_base.motdata.shift_adr; if (!v2) return 0; while (v3) { - if (v3->type == MOTHEAD_DATA_TYPE_41) { + if (v3->type == MHD_SHIFT) { const void* v5 = v3->data; - uint32_t v8 = ((uint32_t*)v5)[0]; - if (v8 & 0x10) { - if (sub_1405054E0(v8) == 1) + prj::BitArray<23> v8(&((uint32_t*)v5)[0]); + if (v8[4]) { + if (v8.count() == 1) return v5; } else { - if (sub_14054F930(v8, a2)) + if (v8 == shift_req) return v5; - if (sub_1405054E0(*a2 & v8)) + v8 &= shift_req; + if (v8.count()) return v5; } } @@ -7794,20 +8311,22 @@ static const void* sub_140551F60(rob_chara* rob_chr, uint32_t* a2) { } static void sub_1405077D0(rob_chara* rob_chr, const bone_database* bone_data, const motion_database* mot_db) { - const void* v2 = sub_140551F60(rob_chr, &rob_chr->data.motion.field_30); - const void* v3 = v2; - if (!v2) - rob_chr->data.motion.field_30 = 0; - else if ((float_t)((int16_t*)v2)[2] <= rob_chr->data.motion.frame_data.frame) { - int32_t v4 = ((int32_t*)v2)[2]; - uint32_t v5 = ((uint32_t*)v2)[0]; - if (v5 & 0x400000 && sub_1405054E0(v5) == 1) - v4 = rob_chr->get_rob_cmn_mottbl_motion_id(0); - if (v4 != -1) { - rob_chr->load_motion(v4, !!(((uint8_t*)v3)[12] & 0x01), 0.0f, MOTION_BLEND, bone_data, mot_db); - //sub_14036D130(8, &rob_chr); + const void* data = sub_140551F60(rob_chr, rob_chr->rob_base.robmot.shift_req); + if (!data) + rob_chr->rob_base.robmot.shift_req.reset(); + else if ((float_t)((int16_t*)data)[2] <= rob_chr->rob_base.robmot.frame.f) { + int32_t motnum = ((int32_t*)data)[2]; + + prj::BitArray<23> flag(&((uint32_t*)data)[0]); + if (flag[22] && flag.count() == 1) + motnum = rob_chr->get_common_mot(MTP_NONE); + if (motnum != -1) { + rob_chr->set_rob_motion(motnum, !!(((uint8_t*)data)[12] & 0x01), 0.0f, MOTION_BLEND, bone_data, mot_db); + + //rob_chara* rob_impl = rob_chr; + //PostEvent(EVENT_TYPE_ROB_MH_SHIFT_MOTION, &rob_impl); } - rob_chr->data.motion.field_30 = 0; + rob_chr->rob_base.robmot.shift_req.reset(); } } @@ -7815,23 +8334,23 @@ static void rob_chara_set_face_motion(rob_chara* rob_chr, RobFaceMotion* motion, int32_t type, const motion_database* mot_db); // 0x140553420 -static void rob_chara_set_face_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_face_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobFaceMotion motion; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; - if (motion_id != -1) { - motion.data.motion_id = motion_id; + if (motnum != -1) { + motion.data.motnum = motnum; motion.data.playback_state = playback_state; motion.data.frame = frame; motion.data.step = step; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &rob_chr->data.motion.frame_data; - motion.data.step_data = &rob_chr->data.motion.step_data; + motion.data.frame_ptr = &rob_chr->rob_base.robmot.frame; + motion.data.step_ptr = &rob_chr->rob_base.robmot.step; } motion.data.loop_state = loop_state; } @@ -7839,7 +8358,7 @@ static void rob_chara_set_face_motion_id(rob_chara* rob_chr, uint32_t motion_id, } static void sub_1405509D0(rob_chara* rob_chr, const motion_database* mot_db) { - if (rob_chr->data.motion.field_150.face.CheckEnded()) + if (rob_chr->rob_base.robmot.field_150.face.CheckEnded()) rob_chara_set_face_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 6.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } @@ -7848,23 +8367,23 @@ static void rob_chara_set_hand_l_motion(rob_chara* rob_chr, RobHandMotion* motion, int32_t type, const motion_database* mot_db); // 0x140553E30 -static void rob_chara_set_hand_l_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_hand_l_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobHandMotion motion; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; - if (motion_id != -1) { - motion.data.motion_id = motion_id; + if (motnum != -1) { + motion.data.motnum = motnum; motion.data.playback_state = playback_state; motion.data.frame = frame; motion.data.step = step; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &rob_chr->data.motion.frame_data; - motion.data.step_data = &rob_chr->data.motion.step_data; + motion.data.frame_ptr = &rob_chr->rob_base.robmot.frame; + motion.data.step_ptr = &rob_chr->rob_base.robmot.step; } motion.data.loop_state = loop_state; } @@ -7872,7 +8391,7 @@ static void rob_chara_set_hand_l_motion_id(rob_chara* rob_chr, uint32_t motion_i } static void sub_140550A40(rob_chara* rob_chr, const motion_database* mot_db) { - if (rob_chr->data.motion.field_150.hand_l.CheckEnded()) + if (rob_chr->rob_base.robmot.field_150.hand_l.CheckEnded()) rob_chara_set_hand_l_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 12.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } @@ -7881,23 +8400,23 @@ static void rob_chara_set_hand_r_motion(rob_chara* rob_chr, RobHandMotion* motion, int32_t type, const motion_database* mot_db); // 0x140554370 -static void rob_chara_set_hand_r_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_hand_r_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobHandMotion motion; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; - if (motion_id != -1) { - motion.data.motion_id = motion_id; + if (motnum != -1) { + motion.data.motnum = motnum; motion.data.playback_state = playback_state; motion.data.frame = frame; motion.data.step = step; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &rob_chr->data.motion.frame_data; - motion.data.step_data = &rob_chr->data.motion.step_data; + motion.data.frame_ptr = &rob_chr->rob_base.robmot.frame; + motion.data.step_ptr = &rob_chr->rob_base.robmot.step; } motion.data.loop_state = loop_state; } @@ -7905,7 +8424,7 @@ static void rob_chara_set_hand_r_motion_id(rob_chara* rob_chr, uint32_t motion_i } static void sub_140550AB0(rob_chara* rob_chr, const motion_database* mot_db) { - if (rob_chr->data.motion.field_150.hand_r.CheckEnded()) + if (rob_chr->rob_base.robmot.field_150.hand_r.CheckEnded()) rob_chara_set_hand_r_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 12.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } @@ -7914,23 +8433,23 @@ static void rob_chara_set_mouth_motion(rob_chara* rob_chr, RobMouthMotion* motion, int32_t type, const motion_database* mot_db); // 0x140554C40 -static void rob_chara_set_mouth_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_mouth_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobMouthMotion motion; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; - if (motion_id != -1) { - motion.data.motion_id = motion_id; + if (motnum != -1) { + motion.data.motnum = motnum; motion.data.playback_state = playback_state; motion.data.frame = frame; motion.data.step = step; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &rob_chr->data.motion.frame_data; - motion.data.step_data = &rob_chr->data.motion.step_data; + motion.data.frame_ptr = &rob_chr->rob_base.robmot.frame; + motion.data.step_ptr = &rob_chr->rob_base.robmot.step; } motion.data.loop_state = loop_state; } @@ -7938,7 +8457,7 @@ static void rob_chara_set_mouth_motion_id(rob_chara* rob_chr, uint32_t motion_id } static void sub_140550B20(rob_chara* rob_chr, const motion_database* mot_db) { - if (rob_chr->data.motion.field_150.mouth.CheckEnded()) + if (rob_chr->rob_base.robmot.field_150.mouth.CheckEnded()) rob_chara_set_mouth_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 6.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } @@ -7947,23 +8466,23 @@ static void rob_chara_set_eyes_motion(rob_chara* rob_chr, RobEyesMotion* motion, int32_t type, const motion_database* mot_db); // 0x140552F10 -static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobEyesMotion motion; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; - if (motion_id != -1) { - motion.data.motion_id = motion_id; + if (motnum != -1) { + motion.data.motnum = motnum; motion.data.playback_state = playback_state; motion.data.frame = frame; motion.data.step = step; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &rob_chr->data.motion.frame_data; - motion.data.step_data = &rob_chr->data.motion.step_data; + motion.data.frame_ptr = &rob_chr->rob_base.robmot.frame; + motion.data.step_ptr = &rob_chr->rob_base.robmot.step; } motion.data.loop_state = loop_state; } @@ -7971,7 +8490,7 @@ static void rob_chara_set_eyes_motion_id(rob_chara* rob_chr, uint32_t motion_id, } static void sub_140550960(rob_chara* rob_chr, const motion_database* mot_db) { - if (rob_chr->data.motion.field_150.eyes.CheckEnded()) + if (rob_chr->rob_base.robmot.field_150.eyes.CheckEnded()) rob_chara_set_eyes_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 6.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } @@ -7980,23 +8499,23 @@ static void rob_chara_set_eyelid_motion(rob_chara* rob_chr, RobEyelidMotion* motion, int32_t type, const motion_database* mot_db); // 0x140552A90 -static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, uint32_t motion_id, +static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, uint32_t motnum, float_t frame, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db) { RobEyelidMotion motion; motion.data.blend_duration = blend_duration; motion.data.blend_offset = blend_offset; - if (motion_id != -1) { - motion.data.motion_id = motion_id; + if (motnum != -1) { + motion.data.motnum = motnum; motion.data.playback_state = playback_state; motion.data.frame = frame; motion.data.step = step; - motion.data.frame_count = motion_storage_get_mot_data_frame_count(motion_id, mot_db); + motion.data.frame_max = get_mot_frame_max(motnum, mot_db); motion.data.play_duration = play_duration; if (motion.CheckPlaybackStateCharaMotion()) { - motion.data.frame_data = &rob_chr->data.motion.frame_data; - motion.data.step_data = &rob_chr->data.motion.step_data; + motion.data.frame_ptr = &rob_chr->rob_base.robmot.frame; + motion.data.step_ptr = &rob_chr->rob_base.robmot.step; } motion.data.loop_state = loop_state; } @@ -8004,7 +8523,7 @@ static void rob_chara_set_eyelid_motion_id(rob_chara* rob_chr, uint32_t motion_i } static void sub_1405508F0(rob_chara* rob_chr, const motion_database* mot_db) { - if (rob_chr->data.motion.field_150.eyelid.CheckEnded()) + if (rob_chr->rob_base.robmot.field_150.eyelid.CheckEnded()) rob_chara_set_eyelid_motion_id(rob_chr, -1, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 6.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, mot_db); } @@ -8014,46 +8533,46 @@ static bool sub_1404190E0(rob_chara_bone_data* rob_bone_data) { } static void sub_140555F70(rob_chara* rob_chr, const motion_database* mot_db) { - if (sub_1404190E0(rob_chr->bone_data) || (rob_chr->data.motion.field_29 & 0x80)) + if (sub_1404190E0(rob_chr->bone_data) || (rob_chr->rob_base.robmot.flag.u32 & 0x8000)) return; - int32_t v3 = rob_chr->data.motion.field_150.field_1C0; + int32_t v3 = rob_chr->rob_base.robmot.field_150.field_1C0; if (v3 == 1) { - if (rob_chr->data.motion.field_29 & 0x02) { + if (rob_chr->rob_base.robmot.flag.u32 & 0x0200) { rob_chr->set_eyelid_mottbl_motion_from_face(2, 3.0f, -1.0f, 1.0f, mot_db); - rob_chr->data.motion.field_29 |= 0x02; + rob_chr->rob_base.robmot.flag.u32 |= 0x0200; return; } return; } else if (v3 == 2) { - rob_chr->data.motion.field_150.field_1C0 = 0; - rob_chr->data.motion.field_29 &= ~0x02; + rob_chr->rob_base.robmot.field_150.field_1C0 = 0; + rob_chr->rob_base.robmot.flag.u32 &= ~0x0200; } else if (v3 != 0) return; sub_1405500F0(rob_chr); - if (!(rob_chr->data.motion.field_2A & 0x02) && rob_chr->data.motion.field_29 & 0x01) { - rob_chr->data.motion.field_150.time += rand_state_array_get_float(1) + if (!(rob_chr->rob_base.robmot.flag.u32 & 0x020000) && rob_chr->rob_base.robmot.flag.bit.ext_frame_req) { + rob_chr->rob_base.robmot.field_150.time += rand_state_array_get_float(1) * rob_chr->frame_speed * 2.0f * (float_t)(1.0 / 60.0); - if (rob_chr->data.motion.field_150.time >= 5.0f) { + if (rob_chr->rob_base.robmot.field_150.time >= 5.0f) { rob_chr->set_eyelid_mottbl_motion_from_face(1, 3.0f, -1.0f, 1.0f, mot_db); - rob_chr->data.motion.field_29 |= 0x02; + rob_chr->rob_base.robmot.flag.u32 |= 0x0200; } } } static void sub_14041CA70(rob_chara_bone_data* rob_bone_data, float_t a2) { - rob_bone_data->motion_loaded.front()->field_4F8.field_C0 = a2; + rob_bone_data->motion_loaded.front()->smooth.field_C0 = a2; } static void sub_14041CAB0(rob_chara_bone_data* rob_bone_data, float_t a2) { - rob_bone_data->motion_loaded.front()->field_4F8.field_C4 = a2; + rob_bone_data->motion_loaded.front()->smooth.field_C4 = a2; } static void sub_14041CA10(rob_chara_bone_data* rob_bone_data, vec3* a2) { - rob_bone_data->motion_loaded.front()->field_4F8.field_C8 = *a2; + rob_bone_data->motion_loaded.front()->smooth.field_C8 = *a2; } static void sub_140415400(mot_play_data* play_data) { @@ -8072,32 +8591,32 @@ static void sub_14041DA00(rob_chara_bone_data* rob_bone_data) { } static object_info sub_140550330(rob_chara* rob_chr) { - if (rob_chr->data.motion.field_29 & 0x04) - return rob_chr->data.motion.field_3B0.head_object; + if (rob_chr->rob_base.robmot.flag.u32 & 0x0400) + return rob_chr->rob_base.robmot.field_3B0.head_object; else - return rob_chr->data.motion.field_150.head_object; + return rob_chr->rob_base.robmot.field_150.head_object; } static object_info sub_140550350(rob_chara* rob_chr){ - if (rob_chr->data.motion.field_29 & 0x08) - return rob_chr->data.motion.field_3B0.hand_l_object; - else if (rob_chr->data.motion.field_2A & 0x04) - return rob_chr->data.motion.hand_l_object; - return rob_chr->data.motion.field_150.hand_l_object; + if (rob_chr->rob_base.robmot.flag.u32 & 0x0800) + return rob_chr->rob_base.robmot.field_3B0.hand_l_object; + else if (rob_chr->rob_base.robmot.flag.u32 & 0x040000) + return rob_chr->rob_base.robmot.hand_l_object; + return rob_chr->rob_base.robmot.field_150.hand_l_object; } static object_info sub_140550380(rob_chara* rob_chr) { - if (rob_chr->data.motion.field_29 & 0x10) - return rob_chr->data.motion.field_3B0.hand_r_object; - else if (rob_chr->data.motion.field_2A & 0x08) - return rob_chr->data.motion.hand_r_object; - return rob_chr->data.motion.field_150.hand_r_object; + if (rob_chr->rob_base.robmot.flag.u32 & 0x1000) + return rob_chr->rob_base.robmot.field_3B0.hand_r_object; + else if (rob_chr->rob_base.robmot.flag.u32 & 0x080000) + return rob_chr->rob_base.robmot.hand_r_object; + return rob_chr->rob_base.robmot.field_150.hand_r_object; } static object_info sub_140550310(rob_chara* rob_chr) { - if (rob_chr->data.motion.field_2A & 0x01) - return rob_chr->data.motion.field_3B0.face_object; - return rob_chr->data.motion.field_150.face_object; + if (rob_chr->rob_base.robmot.flag.u32 & 0x010000) + return rob_chr->rob_base.robmot.field_3B0.face_object; + return rob_chr->rob_base.robmot.field_150.face_object; } static void sub_140419800(rob_chara_bone_data* rob_bone_data, vec3* position) { @@ -8105,43 +8624,42 @@ static void sub_140419800(rob_chara_bone_data* rob_bone_data, vec3* position) { } static float_t sub_1405501F0(rob_chara* rob_chr) { - if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) - return rob_chr->data.motion.field_138 / rob_chr->bone_data->ik_scale.ratio0; - return rob_chr->data.motion.field_138; + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.motion_body_type == 1) + return rob_chr->rob_base.robmot.mot_adjust_scale / rob_chr->bone_data->adjust_scale.base; + return rob_chr->rob_base.robmot.mot_adjust_scale; } static float_t sub_1405503B0(rob_chara* rob_chr) { - if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.skeleton_select == 1) - return rob_chr->data.motion.field_13C / rob_chr->bone_data->ik_scale.ratio0; - return rob_chr->data.motion.field_13C; + if (rob_chr->bone_data->motion_loaded.front()->mot_key_data.motion_body_type == 1) + return rob_chr->rob_base.robmot.mot_xz_adjust_scale / rob_chr->bone_data->adjust_scale.base; + return rob_chr->rob_base.robmot.mot_xz_adjust_scale; } static void sub_140504F00(rob_chara* rob_chr) { - if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x08 - && !(rob_chr->data.motdata.field_0.field_20.field_8 & 0x10000000)) + if (rob_chr->rob_base.motdata.motkind[MK_NO_TRANS] && !rob_chr->rob_base.motdata.motkind[MK_Y_TRANS]) return; vec3 v9 = 0.0f; sub_140419800(rob_chr->bone_data, &v9); - float_t v3 = sub_1405503B0(rob_chr) * rob_chr->data.motion.step_data.frame; - float_t v4 = sub_1405501F0(rob_chr) * rob_chr->data.motion.step_data.frame; - v9.x -= v3 * rob_chr->data.motdata.field_0.field_318.x; - v9.y -= v4 * rob_chr->data.motdata.field_0.field_318.y; - v9.z -= v3 * rob_chr->data.motdata.field_0.field_318.z; + float_t v3 = sub_1405503B0(rob_chr) * rob_chr->rob_base.robmot.step.f; + float_t v4 = sub_1405501F0(rob_chr) * rob_chr->rob_base.robmot.step.f; + v9.x -= v3 * rob_chr->rob_base.motdata.trans_xofs; + v9.y -= v4 * rob_chr->rob_base.motdata.trans_yofs; + v9.z -= v3 * rob_chr->rob_base.motdata.trans_zofs; mat4 mat; - mat4_rotate_y(rob_chr->data.position.yang.get_rad(), &mat); + mat4_rotate_y(rob_chr->rob_base.position.yang.get_rad(), &mat); mat4_transform_vector(&mat, &v9, &v9); - if (!(rob_chr->data.motdata.field_0.field_20.field_0 & 0x08)) { - rob_chr->data.motdata.field_0.field_20.field_0 |= 0x08; - rob_chr->data.position.pos.x = rob_chr->data.position.gpos.x - v9.x; - rob_chr->data.position.pos.z = rob_chr->data.position.gpos.z - v9.z; + if (!rob_chr->rob_base.motdata.motkind[MK_NO_TRANS]) { + rob_chr->rob_base.motdata.motkind.set(MK_NO_TRANS); + rob_chr->rob_base.position.pos.x = rob_chr->rob_base.position.gpos.x - v9.x; + rob_chr->rob_base.position.pos.z = rob_chr->rob_base.position.gpos.z - v9.z; } - if (rob_chr->data.motdata.field_0.field_20.field_8 & 0x10000000) { - rob_chr->data.motdata.field_0.field_20.field_8 &= ~0x10000000; - rob_chr->data.position.pos.y = rob_chr->data.position.gpos.y - v9.y; + if (rob_chr->rob_base.motdata.motkind[MK_Y_TRANS]) { + rob_chr->rob_base.motdata.motkind.reset(MK_Y_TRANS); + rob_chr->rob_base.position.pos.y = rob_chr->rob_base.position.gpos.y - v9.y; } } @@ -8154,66 +8672,64 @@ static void sub_140504710(rob_chara* rob_chr, const motion_database* mot_db, sub_140550960(rob_chr, mot_db); sub_1405508F0(rob_chr, mot_db); sub_140555F70(rob_chr, mot_db); - sub_14041C9D0(rob_chr->bone_data, !!(rob_chr->data.motion.field_28 & 0x08)); - sub_14041D2D0(rob_chr->bone_data, !!(rob_chr->data.motion.field_28 & 0x04)); - sub_14041C680(rob_chr->bone_data, !!rob_chr->data.flag.bit.fix_hara); - sub_14041D270(rob_chr->bone_data, - (float_t)((double_t)rob_chr->data.motdata.field_0.field_274 * M_PI * (1.0 / 32768.0))); - sub_14041CA70(rob_chr->bone_data, rob_chr->data.motion.field_138); - sub_14041CAB0(rob_chr->bone_data, rob_chr->data.motion.field_13C); - sub_14041CA10(rob_chr->bone_data, &rob_chr->data.motion.field_140); + sub_14041C9D0(rob_chr->bone_data, rob_chr->rob_base.robmot.flag.bit.mirror); + sub_14041D2D0(rob_chr->bone_data, rob_chr->rob_base.robmot.flag.bit.next_mirror); + sub_14041C680(rob_chr->bone_data, rob_chr->rob_base.flag.bit.fix_hara); + sub_14041D270(rob_chr->bone_data, rob_chr->rob_base.motdata.mov_yang.get_rad()); + sub_14041CA70(rob_chr->bone_data, rob_chr->rob_base.robmot.mot_adjust_scale); + sub_14041CAB0(rob_chr->bone_data, rob_chr->rob_base.robmot.mot_xz_adjust_scale); + sub_14041CA10(rob_chr->bone_data, &rob_chr->rob_base.robmot.mot_adjust_base_pos); sub_14041DA00(rob_chr->bone_data); - RobFaceMotion* face = &rob_chr->data.motion.field_150.face; - if ((rob_chr->data.motion.field_29 & 0x04)) - face = &rob_chr->data.motion.field_3B0.face; + RobFaceMotion* face = &rob_chr->rob_base.robmot.field_150.face; + if ((rob_chr->rob_base.robmot.flag.u32 & 0x0400)) + face = &rob_chr->rob_base.robmot.field_3B0.face; face->GetFrameStep(); rob_chr->bone_data->set_face_frame(face->data.frame); rob_chr->bone_data->set_face_step(face->data.step); - RobHandMotion* hand_l = &rob_chr->data.motion.field_150.hand_l; - if (rob_chr->data.motion.field_29 & 0x08) - hand_l = &rob_chr->data.motion.field_3B0.hand_l; - else if (rob_chr->data.motion.field_2A & 0x04) - hand_l = &rob_chr->data.motion.hand_l; + RobHandMotion* hand_l = &rob_chr->rob_base.robmot.field_150.hand_l; + if (rob_chr->rob_base.robmot.flag.u32 & 0x0800) + hand_l = &rob_chr->rob_base.robmot.field_3B0.hand_l; + else if (rob_chr->rob_base.robmot.flag.u32 & 0x040000) + hand_l = &rob_chr->rob_base.robmot.hand_l; hand_l->GetFrameStep(); rob_chr->bone_data->set_hand_l_frame(hand_l->data.frame); rob_chr->bone_data->set_hand_l_step(hand_l->data.step); - RobHandMotion* hand_r = &rob_chr->data.motion.field_150.hand_r; - if (rob_chr->data.motion.field_29 & 0x10) - hand_r = &rob_chr->data.motion.field_3B0.hand_r; - else if (rob_chr->data.motion.field_2A & 0x08) - hand_r = &rob_chr->data.motion.hand_r; + RobHandMotion* hand_r = &rob_chr->rob_base.robmot.field_150.hand_r; + if (rob_chr->rob_base.robmot.flag.u32 & 0x1000) + hand_r = &rob_chr->rob_base.robmot.field_3B0.hand_r; + else if (rob_chr->rob_base.robmot.flag.u32 & 0x080000) + hand_r = &rob_chr->rob_base.robmot.hand_r; hand_r->GetFrameStep(); rob_chr->bone_data->set_hand_r_frame(hand_r->data.frame); rob_chr->bone_data->set_hand_r_step(hand_r->data.step); - RobMouthMotion* mouth = &rob_chr->data.motion.field_150.mouth; - if (rob_chr->data.motion.field_29 & 0x20) - mouth = &rob_chr->data.motion.field_3B0.mouth; + RobMouthMotion* mouth = &rob_chr->rob_base.robmot.field_150.mouth; + if (rob_chr->rob_base.robmot.flag.u32 & 0x2000) + mouth = &rob_chr->rob_base.robmot.field_3B0.mouth; mouth->GetFrameStep(); rob_chr->bone_data->set_mouth_frame(mouth->data.frame); rob_chr->bone_data->set_mouth_step(mouth->data.step); - RobEyesMotion* eyes = &rob_chr->data.motion.field_150.eyes; - if (rob_chr->data.motion.field_29 & 0x40) - eyes = &rob_chr->data.motion.field_3B0.eyes; + RobEyesMotion* eyes = &rob_chr->rob_base.robmot.field_150.eyes; + if (rob_chr->rob_base.robmot.flag.u32 & 0x4000) + eyes = &rob_chr->rob_base.robmot.field_3B0.eyes; eyes->GetFrameStep(); rob_chr->bone_data->set_eyes_frame(eyes->data.frame); rob_chr->bone_data->set_eyes_step(eyes->data.step); - RobEyelidMotion* eyelid = &rob_chr->data.motion.field_150.eyelid; - if (rob_chr->data.motion.field_29 & 0x80) - eyelid = &rob_chr->data.motion.field_3B0.eyelid; + RobEyelidMotion* eyelid = &rob_chr->rob_base.robmot.field_150.eyelid; + if (rob_chr->rob_base.robmot.flag.u32 & 0x8000) + eyelid = &rob_chr->rob_base.robmot.field_3B0.eyelid; eyelid->GetFrameStep(); rob_chr->bone_data->set_eyelid_frame(eyelid->data.frame); rob_chr->bone_data->set_eyelid_step(eyelid->data.step); object_info v8 = sub_140550330(rob_chr); if (rob_chara_get_object_info(rob_chr, RPK_ATAMA) != v8) - rob_chr->load_outfit_object_info(RPK_ATAMA, - v8, false, bone_data, data, obj_db); + rob_chr->set_base(RPK_ATAMA, v8, false, bone_data, data, obj_db); object_info v9 = rob_chara_get_head_object(rob_chr, 1); object_info v10 = rob_chara_get_head_object(rob_chr, 7); @@ -8223,98 +8739,98 @@ static void sub_140504710(rob_chara* rob_chr, const motion_database* mot_db, object_info v12 = sub_140550350(rob_chr); if (rob_chara_get_object_info(rob_chr, RPK_TE_L) != v12) - rob_chr->load_outfit_object_info(RPK_TE_L, - v12, true, bone_data, data, obj_db); + rob_chr->set_base(RPK_TE_L, v12, true, bone_data, data, obj_db); object_info v13 = sub_140550380(rob_chr); if (rob_chara_get_object_info(rob_chr, RPK_TE_R) != v13) - rob_chr->load_outfit_object_info(RPK_TE_R, - v13, true, bone_data, data, obj_db); + rob_chr->set_base(RPK_TE_R, v13, true, bone_data, data, obj_db); object_info v14 = sub_140550310(rob_chr); if (rob_chara_get_object_info(rob_chr, RPK_HARA) != v14) - rob_chr->load_outfit_object_info(RPK_HARA, - v14, false, bone_data, data, obj_db); + rob_chr->set_base(RPK_HARA, v14, false, bone_data, data, obj_db); rob_chr->bone_data->interpolate(); rob_chr->bone_data->update(0); sub_140504F00(rob_chr); - rob_chr->data.motion.field_28 &= ~0x80; + rob_chr->rob_base.robmot.flag.u32 &= ~0x80; } static void sub_140504AC0(rob_chara* rob_chr) { - vec3 v4 = rob_chr->data.position.spd; + vec3 v4 = rob_chr->rob_base.position.spd; vec3 v20 = 0.0f; - if (rob_chr->data.flag.bit.fix_hara) { - v20 = v4 + rob_chr->data.position.adjust_spd + rob_chr->data.action.field_B8.field_10; - v4.y = rob_chr->data.action.field_B8.field_10.y - - get_gravity() * rob_chr->data.motdata.field_0.field_200; + if (rob_chr->rob_base.flag.bit.fix_hara) { + v20 = v4 + rob_chr->rob_base.position.adjust_spd + rob_chr->rob_base.action.yarare.efc_spd; + v4.y = rob_chr->rob_base.action.yarare.efc_spd.y - get_gravity() * rob_chr->rob_base.motdata.gravity; } - else if (!rob_chr->data.flag.bit.jump_rise) { - v20 = rob_chr->data.position.adjust_spd; - v20.x += v4.x + rob_chr->data.action.field_B8.field_10.x; - v20.z += v4.z + rob_chr->data.action.field_B8.field_10.z; + else if (!rob_chr->rob_base.flag.bit.jump_rise) { + v20 = rob_chr->rob_base.position.adjust_spd; + v20.x += v4.x + rob_chr->rob_base.action.yarare.efc_spd.x; + v20.z += v4.z + rob_chr->rob_base.action.yarare.efc_spd.z; float_t v7 = 0.4f; - if (rob_chr->data.motdata.field_0.field_20.field_0 & 0xC00) + if (rob_chr->rob_base.motdata.motkind[MK_DOWN_POSE] + || rob_chr->rob_base.motdata.motkind[MK_DOWN]) v7 = 0.6f; float_t v13 = powf(v7, 1.0f); - if (rob_chr->data.motdata.field_330.field_18) + if (rob_chr->rob_base.motdata.target.target_flag != ROB_TARGET_NONE) v13 = 1.0f; v4.x *= v13; v4.y = 0.0f; v4.z *= v13; - rob_chr->data.action.field_B8.field_10.x *= v13; - rob_chr->data.action.field_B8.field_10.z *= v13; + rob_chr->rob_base.action.yarare.efc_spd.x *= v13; + rob_chr->rob_base.action.yarare.efc_spd.z *= v13; - if (rob_chr->data.flag.bit.ringout - && rob_chr->data.motdata.field_0.field_1EC > rob_chr->data.motion.frame_data.frame) { - v20.x += rob_chr->data.field_3DD4; - v20.z += rob_chr->data.field_3DDC; + if (rob_chr->rob_base.flag.bit.ringout + && rob_chr->rob_base.motdata.jump_frame > rob_chr->rob_base.robmot.frame.f) { + v20.x += rob_chr->rob_base.ringout.ringout_spd.x; + v20.z += rob_chr->rob_base.ringout.ringout_spd.z; } - if (rob_chr->data.motdata.field_330.field_18 == 3) { + if (rob_chr->rob_base.motdata.target.target_flag == ROB_TARGET_RINGOUT) { v20 = 0.0f; - if (rob_chr->data.motdata.field_330.field_1C >= rob_chr->data.motion.frame_data.frame) - v20.y = rob_chr->data.motdata.field_330.field_20.y; + if (rob_chr->rob_base.motdata.target.target_end >= rob_chr->rob_base.robmot.frame.f) + v20.y = rob_chr->rob_base.motdata.target.target_pos.y; else - rob_chr->data.motdata.field_330.field_18 = 0; + rob_chr->rob_base.motdata.target.target_flag = ROB_TARGET_NONE; } - else if (rob_chr->data.motdata.field_330.field_18) { + else if (rob_chr->rob_base.motdata.target.target_flag) { v20.x = 0.0f; v20.z = 0.0f; - if (rob_chr->data.motion.frame_data.frame > rob_chr->data.motdata.field_330.field_1C - || rob_chr->data.field_1E68.field_1C && rob_chr->data.motdata.field_330.field_18 == 1) - rob_chr->data.motdata.field_330.field_18 = 0; + if (rob_chr->rob_base.robmot.frame.f > rob_chr->rob_base.motdata.target.target_end + || rob_chr->rob_base.collision.wall_hit_num + && rob_chr->rob_base.motdata.target.target_flag == ROB_TARGET_WALL) + rob_chr->rob_base.motdata.target.target_flag = ROB_TARGET_NONE; else { - float_t v17 = rob_chr->data.motdata.field_330.field_1C - - rob_chr->data.motion.frame_data.frame; + float_t v17 = rob_chr->rob_base.motdata.target.target_end + - rob_chr->rob_base.robmot.frame.f; if (v17 < 0.0f) v17 = 0.0f; float_t v18 = 1.0f / (v17 + 1.0f); - v20.x = v18 * (rob_chr->data.motdata.field_330.field_20.x - - rob_chr->data.position.gpos.x); - v20.z = v18 * (rob_chr->data.motdata.field_330.field_20.z - - rob_chr->data.position.gpos.z); + v20.x = v18 * (rob_chr->rob_base.motdata.target.target_pos.x + - rob_chr->rob_base.position.gpos.x); + v20.z = v18 * (rob_chr->rob_base.motdata.target.target_pos.z + - rob_chr->rob_base.position.gpos.z); } } } - if (rob_chr->data.motdata.field_0.field_20.field_4 & 0x4000000 - && (rob_chr->data.field_3DA0 & 0x40 && rob_chr->data.field_3D9C & 0x20 - || rob_chr->data.field_3DA0 & 0x20 && rob_chr->data.field_3D9C & 0x40)) { + if (rob_chr->rob_base.motdata.motkind[MK_BACK_SPEED_OFF] + && (rob_chr->rob_base.robinfo.old_en_flag.bit.en_front + && rob_chr->rob_base.robinfo.en_flag.bit.en_down_nage + || rob_chr->rob_base.robinfo.old_en_flag.bit.en_down_nage + && rob_chr->rob_base.robinfo.en_flag.bit.en_front)) { v4.x = 0.0f; v4.z = 0.0f; } - rob_chr->data.position.spd = v4; - rob_chr->data.position.adjust_spd = 0.0f; - rob_chr->data.position.pos = v20 + rob_chr->data.position.pos; + rob_chr->rob_base.position.spd = v4; + rob_chr->rob_base.position.adjust_spd = 0.0f; + rob_chr->rob_base.position.pos = v20 + rob_chr->rob_base.position.pos; } static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { @@ -8334,6 +8850,7 @@ static void rob_base_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { static void rob_base_rob_chara_free(rob_chara* rob_chr) { //sub_14054F370(&rob_chr->rob_touch); + rob_chr->rob_base.sub_action.dest(); rob_chara_bone_data_motion_blend_mot_free(rob_chr->bone_data); } @@ -8343,35 +8860,35 @@ static void rob_disp_rob_chara_init(rob_chara* rob_chr, bone_database* aft_bone_data = &aft_data->data_ft.bone_data; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; const RobData* rob_data = rob_chr->rob_data; RobNode* v3 = rob_chara_bone_data_get_node(rob_chr->bone_data, BONE_NODE_N_HARA_CP); - rob_disp->reset_init_data(v3); - rob_disp->set_one_skin(rob_chr->cos_id == 501); - rob_disp->set_item({}, RPK_BODY, false, bone_data, data, obj_db); + disp->reset_init_data(v3); + disp->set_one_skin(rob_chr->cos_id == 501); + disp->set_skin({}, RPK_BODY, false, bone_data, data, obj_db); for (int32_t i = RPK_BASE_BEGIN; i <= RPK_BASE_END; i++) - rob_disp->load_outfit_object_info((ROB_PARTS_KIND)i, - rob_data->body_obj_uid[i], false, aft_bone_data, aft_data, aft_obj_db); - rob_disp->set_shadow_group(rob_chr->chara_id); - rob_chr->rob_disp->shadow_flag = 0x05; - rob_chr->item_cos_data.reload_items(rob_chr->chara_id, bone_data, data, obj_db); - if (rob_chr->item_cos_data.check_for_npr_flag()) - rob_chr->rob_disp->npr_flag = true; + disp->set_base((ROB_PARTS_KIND)i, rob_data->body_obj_uid[i], false, + aft_bone_data, aft_data, aft_obj_db); + disp->set_shadow_group(rob_chr->idnm); + rob_chr->disp->shadow_flag = 0x05; + rob_chr->item.equip(rob_chr->idnm, bone_data, data, obj_db); + if (rob_chr->item.check_for_npr_flag()) + rob_chr->disp->npr_flag = true; if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_load(rob_chr->chara_id, 1); - rob_chara_age_age_array_load(rob_chr->chara_id, 2); + rob_chara_age_age_array_load(rob_chr->idnm, 1); + rob_chara_age_age_array_load(rob_chr->idnm, 2); } } static void rob_disp_rob_chara_ctrl(rob_chara* rob_chr) { - if (!rob_chr->field_C) + if (!rob_chr->disp_pos_reset) return; - rob_chr->field_C = false; + rob_chr->disp_pos_reset = false; - if (rob_chr->field_D) { - rob_chr->field_D = false; + if (rob_chr->disp_pos_reset_forbidden) { + rob_chr->disp_pos_reset_forbidden = false; return; } @@ -8385,33 +8902,33 @@ static void rob_disp_rob_chara_ctrl_thread_main(rob_chara* rob_chr) { if (rob_chr->bone_data->get_frame() < 0.0f) rob_chr->bone_data->set_frame(0.0f); - float_t frame_count = rob_chr->bone_data->get_frame_count(); - if (rob_chr->bone_data->get_frame() > frame_count) - rob_chr->bone_data->set_frame(frame_count); + float_t frame_max = rob_chr->bone_data->get_frame_max(); + if (rob_chr->bone_data->get_frame() > frame_max) + rob_chr->bone_data->set_frame(frame_max); - rob_chr->rob_disp->set_opd_blend_data(&rob_chr->bone_data->motion_loaded); + rob_chr->disp->set_opd_blend_data(&rob_chr->bone_data->motion_loaded); vec3 pos = 0.0f; - rob_chr->get_pos_scale(0, pos); - rob_chr->rob_disp->position = pos; - rob_chara_item_equip_ctrl(rob_chr->rob_disp); + rob_chr->get_pos_scale(ROB_COLLI_ID_KOSHI, pos); + rob_chr->disp->position = pos; + RobDisp_ctrl(rob_chr->disp); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_step(rob_chr->chara_id, 1, rob_chr->rob_disp->osage_step); + rob_chara_age_age_array_set_step(rob_chr->idnm, 1, rob_chr->disp->osage_step); rob_chara_age_age_ctrl(rob_chr, 1, "j_tail_l_006_wj"); - rob_chara_age_age_array_set_step(rob_chr->chara_id, 2, rob_chr->rob_disp->osage_step); + rob_chara_age_age_array_set_step(rob_chr->idnm, 2, rob_chr->disp->osage_step); rob_chara_age_age_ctrl(rob_chr, 2, "j_tail_r_006_wj"); } } static void rob_disp_rob_chara_disp(rob_chara* rob_chr) { - rob_chr->rob_disp->skin_color = 1.0f; - rob_chr->rob_disp->mat = rob_chr->data.adjust_data.mat; - rob_chr->rob_disp->disp(rob_chr->chara_id, rctx_ptr); + rob_chr->disp->skin_color = 1.0f; + rob_chr->disp->mat = rob_chr->rob_base.adjust.mat; + rob_chr->disp->disp(rob_chr->idnm, rctx_ptr); } static void rob_disp_rob_chara_free(rob_chara* rob_chr) { - rob_chara_age_age_array_reset(rob_chr->chara_id); - rob_chr->rob_disp->reset(); + rob_chara_age_age_array_reset(rob_chr->idnm); + rob_chr->disp->reset(); } static void sub_140409B70(rob_chara_look_anim* look_anim, @@ -8481,18 +8998,18 @@ static float_t sub_14040ADE0(float_t a1, float_t a2) { } static void sub_140407280(rob_chara_look_anim* look_anim, - prj::sys_vector& bones, const mat4& parent_mat, float_t step) { + prj::sys_vector& block_vec, const mat4& cur_mat, float_t step) { vec3 v69; - mat4_get_translation(bones[BLK_CL_KAO].node[2].mat_ptr, &v69); + mat4_get_translation(block_vec[BLK_CL_KAO].node[2].mat_ptr, &v69); if (!look_anim->field_190 && !look_anim->field_191) return; float_t v14 = step * 0.25f; float_t v15 = look_anim->field_15C.field_8; float_t v16 = look_anim->field_15C.field_C; - mat4* c_kata_r_mat = bones[BLK_C_KATA_R].node[0].mat_ptr; - mat4* c_kata_l_mat = bones[BLK_C_KATA_L].node[0].mat_ptr; - mat4* n_kao_mat = bones[BLK_N_KAO].node[0].mat_ptr; + const mat4* c_kata_r_mat = block_vec[BLK_C_KATA_R].node[0].mat_ptr; + const mat4* c_kata_l_mat = block_vec[BLK_C_KATA_L].node[0].mat_ptr; + const mat4* n_kao_mat = block_vec[BLK_N_KAO].node[0].mat_ptr; float_t v23 = atan2f(n_kao_mat->row0.x, n_kao_mat->row2.x); float_t v24 = atan2f(c_kata_r_mat->row3.x - c_kata_l_mat->row3.x, c_kata_r_mat->row3.z - c_kata_l_mat->row3.z); @@ -8642,7 +9159,7 @@ static void sub_140407280(rob_chara_look_anim* look_anim, v48 = look_anim->field_1AC.field_0; } - mat4 cl_kao_mat = *bones[BLK_CL_KAO].node[1].mat_ptr; + mat4 cl_kao_mat = *block_vec[BLK_CL_KAO].node[1].mat_ptr; float_t head_rot_angle = (v48 - atan2f(-v68.x, v68.y)) * look_anim->head_rot_blend; vec3 head_rot_axis; head_rot_axis.x = n_kao_mat->row2.x * 0.5f; @@ -8690,24 +9207,24 @@ static void sub_140407280(rob_chara_look_anim* look_anim, mat4_mul_rotate_y(&cl_kao_mat, v58 * look_anim->head_rot_blend, &cl_kao_mat); - mat4 cl_kao_mat_backup = bones[BLK_CL_KAO].chain_rot[1]; + mat4 cl_kao_mat_backup = block_vec[BLK_CL_KAO].chain_rot[1]; mat4 v74; - mat4_invert(bones[BLK_CL_KAO].node[0].mat_ptr, &v74); + mat4_invert(block_vec[BLK_CL_KAO].node[0].mat_ptr, &v74); mat4_clear_trans(&v74, &v74); mat4_clear_trans(&cl_kao_mat, &cl_kao_mat); - mat4_mul(&cl_kao_mat, &v74, &bones[BLK_CL_KAO].chain_rot[1]); + mat4_mul(&cl_kao_mat, &v74, &block_vec[BLK_CL_KAO].chain_rot[1]); for (int32_t i = BLK_CL_KAO; i <= BLK_N_KUBI_WJ_EX; i++) - bones[i].mult_mat(parent_mat, bones.data(), true); + block_vec[i].recalc_fk_block(cur_mat, block_vec.data(), true); - bones[BLK_CL_KAO].chain_rot[1] = cl_kao_mat_backup; + block_vec[BLK_CL_KAO].chain_rot[1] = cl_kao_mat_backup; } static void sub_1404189A0(rob_chara_bone_data* rob_bone_data) { motion_blend_mot* mot = rob_bone_data->motion_loaded.front(); - sub_140407280(&rob_bone_data->look_anim, mot->bone_data.bones, - mot->field_4F8.mat, mot->mot_play_data.frame_data.step); + sub_140407280(&rob_bone_data->look_anim, mot->bone_data.block_vec, + mot->smooth.base_mtx, mot->mot_play_data.frame_data.step); } static void sub_140406FC0(rob_chara_look_anim* look_anim, RobBlock* bone, mat4* eye_mat, vec3 pos, @@ -8759,11 +9276,11 @@ static void sub_140406FC0(rob_chara_look_anim* look_anim, RobBlock* bone, mat4* } static void sub_140409170(rob_chara_look_anim* look_anim, const mat4& adjust_mat, - prj::sys_vector& bones, const mat4& mat, float_t step) { + prj::sys_vector& block_vec, const mat4& mat, float_t step) { if (look_anim->disable) return; - look_anim->bones = &bones; + look_anim->block_vec = &block_vec; look_anim->mat = mat; bool eyes_rot_anim = false; @@ -8795,8 +9312,8 @@ static void sub_140409170(rob_chara_look_anim* look_anim, const mat4& adjust_mat mat4_invert(&adjust_mat, &v61); mat4_transform_point(&v61, &look_anim->view_point, &look_anim->view_point); - const mat4* kl_eye_l_parent_mat = bones[BLK_KL_EYE_L].inherit_mat_ptr; - const mat4* kl_eye_r_parent_mat = bones[BLK_KL_EYE_R].inherit_mat_ptr; + const mat4* kl_eye_l_parent_mat = block_vec[BLK_KL_EYE_L].inherit_mat_ptr; + const mat4* kl_eye_r_parent_mat = block_vec[BLK_KL_EYE_R].inherit_mat_ptr; float_t yrot_neg_left; float_t yrot_pos_left; @@ -8865,7 +9382,7 @@ static void sub_140409170(rob_chara_look_anim* look_anim, const mat4& adjust_mat vec3 rot_pos_left = vec3(xrot_pos, yrot_pos_left, 0.0f); vec3 pos_left; mat4_inverse_transform_point(kl_eye_l_parent_mat, &look_anim->view_point, &pos_left); - sub_140406FC0(look_anim, &bones[BLK_KL_EYE_L], + sub_140406FC0(look_anim, &block_vec[BLK_KL_EYE_L], &look_anim->left_eye_mat, pos_left - look_anim->param.pos, rot_neg_left, rot_pos_left, eyes_rot_anim, eyes_rot_blend, eyes_rot_step); @@ -8874,29 +9391,29 @@ static void sub_140409170(rob_chara_look_anim* look_anim, const mat4& adjust_mat vec3 rot_pos_right = vec3(xrot_pos, yrot_pos_right, 0.0f); vec3 pos_right; mat4_inverse_transform_point(kl_eye_r_parent_mat, &look_anim->view_point, &pos_right); - sub_140406FC0(look_anim, &bones[BLK_KL_EYE_R], + sub_140406FC0(look_anim, &block_vec[BLK_KL_EYE_R], &look_anim->right_eye_mat, pos_right - (look_anim->param.pos ^ _xor), rot_neg_right, rot_pos_right, eyes_rot_anim, eyes_rot_blend, eyes_rot_step); for (int32_t i = BLK_KL_EYE_L; i <= BLK_KL_HIGHLIGHT_L_WJ; i++) - bones[i].mult_mat(mat, bones.data(), true); + block_vec[i].recalc_fk_block(mat, block_vec.data(), true); for (int32_t i = BLK_KL_EYE_R; i <= BLK_KL_HIGHLIGHT_R_WJ; i++) - bones[i].mult_mat(mat, bones.data(), true); + block_vec[i].recalc_fk_block(mat, block_vec.data(), true); } static void sub_14041A160(rob_chara_bone_data* rob_bone_data, const mat4& adjust_mat) { motion_blend_mot* mot = rob_bone_data->motion_loaded.front(); - sub_140409170(&rob_bone_data->look_anim, adjust_mat, mot->bone_data.bones, - mot->field_4F8.mat, mot->mot_play_data.frame_data.step); + sub_140409170(&rob_bone_data->look_anim, adjust_mat, mot->bone_data.block_vec, + mot->smooth.base_mtx, mot->mot_play_data.frame_data.step); } static void rob_chara_head_adjust(rob_chara* rob_chr) { - if (rob_chr->type != ROB_CHARA_TYPE_2) + if (rob_chr->type != ROB_TYPE_AUTH) return; - bool v4 = !rob_chr->data.flag.bit.dmy_yokerare; - rob_chr->data.flag.bit.dmy_yokerare = 0; + bool v4 = !rob_chr->rob_base.flag.bit.dmy_yokerare; + rob_chr->rob_base.flag.bit.dmy_yokerare = 0; rob_chara_bone_data* rob_bone_data = rob_chr->bone_data; vec3* target_view_point = 0; @@ -8913,9 +9430,9 @@ static void rob_chara_head_adjust(rob_chara* rob_chr) { target_view_point = rob_bone_data->get_look_anim_target_view_point(); } - sub_14041C620(rob_bone_data, target_view_point, &rob_chr->data.adjust_data.mat, v4); + sub_14041C620(rob_bone_data, target_view_point, &rob_chr->rob_base.adjust.mat, v4); sub_1404189A0(rob_bone_data); - sub_14041A160(rob_bone_data, rob_chr->data.adjust_data.mat); + sub_14041A160(rob_bone_data, rob_chr->rob_base.adjust.mat); } static void rob_chara_set_hand_adjust(rob_chara* rob_chr, @@ -8923,8 +9440,9 @@ static void rob_chara_set_hand_adjust(rob_chara* rob_chr, if (!adjust->enable) return; - float_t chara_scale = rob_chr->data.adjust_data.scale; - float_t opposite_chara_scale = rob_chara_array_get_data_adjust_scale(rob_chr->chara_id ? 0 : 1); + float_t chara_scale = rob_chr->rob_base.adjust.scale; + RobManagement* rob_man = get_rob_management(); + float_t opposite_chara_scale = rob_man->get_adjust_scale(rob_chr->idnm ? ROB_ID_1P : ROB_ID_2P); bool chara_opposite_chara_same = fabsf(chara_scale - opposite_chara_scale) <= 0.000001f; switch (adjust->type) { @@ -8947,19 +9465,19 @@ static void rob_chara_set_hand_adjust(rob_chara* rob_chr, adjust->scale = opposite_chara_scale; break; case ROB_CHARA_DATA_HAND_ADJUST_1P: - adjust->scale = rob_chara_array_get_data_adjust_scale(0); + adjust->scale = rob_man->get_adjust_scale(ROB_ID_1P); break; case ROB_CHARA_DATA_HAND_ADJUST_2P: - adjust->scale = rob_chara_array_get_data_adjust_scale(1); + adjust->scale = rob_man->get_adjust_scale(ROB_ID_2P); break; case ROB_CHARA_DATA_HAND_ADJUST_3P: - adjust->scale = rob_chara_array_get_data_adjust_scale(2); + adjust->scale = rob_man->get_adjust_scale(ROB_ID_3P); break; case ROB_CHARA_DATA_HAND_ADJUST_4P: - adjust->scale = rob_chara_array_get_data_adjust_scale(3); + adjust->scale = rob_man->get_adjust_scale(ROB_ID_4P); break; case ROB_CHARA_DATA_HAND_ADJUST_ITEM: // X - adjust->scale = rob_chr->data.adjust_data.item_scale; + adjust->scale = rob_chr->rob_base.adjust.item_scale; break; } @@ -8996,14 +9514,14 @@ static void rob_chara_set_hand_adjust(rob_chara* rob_chr, else { float_t t = (adjust->current_time + 1.0f) / (adjust->duration + 1.0f); adjust->current_scale = lerp_def(prev_scale, scale, t * adjust->scale_blend); - adjust->current_time += rob_chr->data.motion.step_data.frame; + adjust->current_time += rob_chr->rob_base.robmot.step.f; } } static void rob_chara_set_hands_adjust(rob_chara* rob_chr) { for (int32_t i = 0; i < 2; i++) - rob_chara_set_hand_adjust(rob_chr, &rob_chr->data.motion.hand_adjust[i], - &rob_chr->data.motion.hand_adjust_prev[i]); + rob_chara_set_hand_adjust(rob_chr, &rob_chr->rob_base.robmot.hand_adjust[i], + &rob_chr->rob_base.robmot.hand_adjust_prev[i]); } static void sub_14040AE10(mat4* mat, const vec3& target) { @@ -9022,16 +9540,16 @@ static void sub_14040AE10(mat4* mat, const vec3& target) { } } -static void sub_140406A70(struc_936* a1, prj::sys_vector& bones, const mat4& mat, const vec3& target, - const BONE_BLK* a5, float_t rotation_blend, float_t arm_length, bool solve_ik) { - RobBlock* v14 = &bones[a5[0]]; +static void sub_140406A70(Motion::AshiOidashiColle* a1, prj::sys_vector& block_vec, const mat4& mat, const vec3& target, + const BONE_BLK* a5, float_t rotation_blend, float_t arm_length, bool rot) { + RobBlock* v14 = &block_vec[a5[0]]; if (v14->up_vector_mat_ptr) { vec3 v36; mat4_get_translation(v14->up_vector_mat_ptr, &v36); mat4 v38 = *v14->node->mat_ptr; - sub_14040AE10(&v38, v14->leaf_pos[1]); + sub_14040AE10(&v38, v14->leaf_pos[0]); mat4_inverse_transform_point(&v38, &v36, &v36); v38 = *v14->node->mat_ptr; @@ -9042,15 +9560,15 @@ static void sub_140406A70(struc_936* a1, prj::sys_vector& bones, const mat4_set_translation((mat4*)v14->up_vector_mat_ptr, &v37); } - v14->leaf_pos[1] = target; + v14->leaf_pos[0] = target; v14->chain_rot[1] = mat4_identity; v14->chain_rot[2] = mat4_identity; - v14->get_mat_ik(1); + v14->solve_ik(1); if (a5[1] == BLK_DUMMY) return; - RobBlock* v25 = &bones[a5[1]]; + RobBlock* v25 = &block_vec[a5[1]]; if (rotation_blend > 0.0f) { mat4 v38; mat4 v39; @@ -9063,137 +9581,137 @@ static void sub_140406A70(struc_936* a1, prj::sys_vector& bones, const v25->chain_rot[0] = v38; } - if (solve_ik) { + if (rot) { a5++; while (*a5 != BLK_DUMMY) - bones[*a5++].mult_mat(mat, bones.data(), true); + block_vec[*a5++].recalc_fk_block(mat, block_vec.data(), true); } else - v25->mult_mat(mat, bones.data(), false); + v25->recalc_fk_block(mat, block_vec.data(), false); } static void sub_140418A00(rob_chara_bone_data* rob_bone_data, const vec3& target, - const BONE_BLK* a3, float_t rotation_blend, float_t arm_length, bool solve_ik) { + const BONE_BLK* a3, float_t rotation_blend, float_t arm_length, bool rot) { motion_blend_mot* mot = rob_bone_data->motion_loaded.front(); - mat4 m = mot->field_4F8.mat; - sub_140406A70(&rob_bone_data->field_76C, mot->bone_data.bones, - m, target, a3, rotation_blend, arm_length, solve_ik); + mat4 cur_mat = mot->smooth.base_mtx; + sub_140406A70(&rob_bone_data->ashi_oidashi, mot->bone_data.block_vec, + cur_mat, target, a3, rotation_blend, arm_length, rot); } static bool sub_14053ACA0(rob_chara* rob_chr, int32_t hand) { - if (hand >= 2 || !rob_chr->data.motion.hand_adjust[hand].enable) + if (hand >= 2 || !rob_chr->rob_base.robmot.hand_adjust[hand].enable) return false; - float_t rotation_blend = rob_chr->data.motion.hand_adjust[hand].rotation_blend; - float_t chara_scale = rob_chr->data.adjust_data.scale; - float_t adjust_scale = rob_chr->data.motion.hand_adjust[hand].current_scale; + float_t rotation_blend = rob_chr->rob_base.robmot.hand_adjust[hand].rotation_blend; + float_t chara_scale = rob_chr->rob_base.adjust.scale; + float_t adjust_scale = rob_chr->rob_base.robmot.hand_adjust[hand].current_scale; - rob_chara_adjust_data adjust_data = rob_chr->data.adjust_data; + RobAdjust adjust = rob_chr->rob_base.adjust; float_t scale = adjust_scale / chara_scale; - adjust_data.scale = scale; - adjust_data.item_scale = scale; // X - rob_chr->set_data_adjust_mat(&adjust_data, false); + adjust.scale = scale; + adjust.item_scale = scale; // X + rob_chr->set_data_adjust_mat(&adjust, false); int32_t v15 = 0; - bool solve_ik = true; - if (rob_chr->data.motion.hand_adjust[hand].iterations > 0 + bool rot = true; + if (rob_chr->rob_base.robmot.hand_adjust[hand].init_cnt > 0 && fabsf(rotation_blend - 1.0f) > 0.000001f - && (fabsf(rob_chr->data.motion.hand_adjust[hand].offset.x) > 0.000001f - || fabsf(rob_chr->data.motion.hand_adjust[hand].offset.y) > 0.000001f - || fabsf(rob_chr->data.motion.hand_adjust[hand].offset.z) > 0.000001f)) { - v15 = rob_chr->data.motion.hand_adjust[hand].iterations; - solve_ik = false; + && (fabsf(rob_chr->rob_base.robmot.hand_adjust[hand].offset.x) > 0.000001f + || fabsf(rob_chr->rob_base.robmot.hand_adjust[hand].offset.y) > 0.000001f + || fabsf(rob_chr->rob_base.robmot.hand_adjust[hand].offset.z) > 0.000001f)) { + v15 = rob_chr->rob_base.robmot.hand_adjust[hand].init_cnt; + rot = false; } - mat4* v40 = rob_chr->bone_data->get_mats_mat(rob_kl_te_bones[hand]); + mat4* v40 = rob_chr->bone_data->get_mats_mat(lc_target_arm_tbl[hand]); mat4 v42; - mat4_mul(v40, &adjust_data.mat, &v42); + mat4_mul(v40, &adjust.mat, &v42); - vec3 v37 = rob_chr->data.motion.hand_adjust[hand].offset * (1.0f - chara_scale / adjust_scale); + vec3 v37 = rob_chr->rob_base.robmot.hand_adjust[hand].offset * (1.0f - chara_scale / adjust_scale); vec3 v38; mat4_transform_point(&v42, &v37, &v38); vec3 v27 = 0.0f; - if (rob_chr->data.motion.hand_adjust[hand].disable_x) + if (rob_chr->rob_base.robmot.hand_adjust[hand].disable_x) v27.x = v40->row3.x - v38.x; - if (rob_chr->data.motion.hand_adjust[hand].disable_y) + if (rob_chr->rob_base.robmot.hand_adjust[hand].disable_y) v27.y = v40->row3.y - v38.y; - if (rob_chr->data.motion.hand_adjust[hand].disable_z) + if (rob_chr->rob_base.robmot.hand_adjust[hand].disable_z) v27.z = v40->row3.z - v38.z; vec3 target = v38 + v27; vec3 v18 = 0.0f; if (v15 > 0) { - mat4_transform_point(&v42, &rob_chr->data.motion.hand_adjust[hand].offset, &v38); + mat4_transform_point(&v42, &rob_chr->rob_base.robmot.hand_adjust[hand].offset, &v38); v18 = v38 + v27; } - sub_140418A00(rob_chr->bone_data, target, off_140C9E020[hand], rotation_blend, - rob_chr->data.motion.hand_adjust[hand].arm_length, solve_ik); + sub_140418A00(rob_chr->bone_data, target, recalc_flip_ik_block_tbl[hand], rotation_blend, + rob_chr->rob_base.robmot.hand_adjust[hand].arm_length, rot); while (v15 > 0) { - mat4* v40 = rob_chr->bone_data->get_mats_mat(rob_kl_te_bones[hand]); + mat4* v40 = rob_chr->bone_data->get_mats_mat(lc_target_arm_tbl[hand]); mat4_set_translation(v40, &v18); - vec3 v37 = -rob_chr->data.motion.hand_adjust[hand].offset; + vec3 v37 = -rob_chr->rob_base.robmot.hand_adjust[hand].offset; mat4_transform_point(v40, &v37, &target); if (!--v15) { rotation_blend = 1.0f; - solve_ik = true; + rot = true; } - sub_140418A00(rob_chr->bone_data, target, off_140C9E020[hand], rotation_blend, - rob_chr->data.motion.hand_adjust[hand].arm_length, solve_ik); + sub_140418A00(rob_chr->bone_data, target, recalc_flip_ik_block_tbl[hand], rotation_blend, + rob_chr->rob_base.robmot.hand_adjust[hand].arm_length, rot); } - rob_chr->data.motion.hand_adjust[hand].target = target; + rob_chr->rob_base.robmot.hand_adjust[hand].target = target; return true; } -static void sub_140412860(motion_blend_mot* mot, BONE_BLK index, mat4* mat) { - if (index >= mot->bone_data.bones.size()) +// 0x140412860 +static void sub_140412860(motion_blend_mot* mot, BONE_BLK block, mat4* out_mat) { + if (block >= mot->bone_data.block_vec.size()) return; - RobBlock* v4 = &mot->bone_data.bones.data()[index]; - if (!v4) + RobBlock* bl = &mot->bone_data.block_vec[block]; + if (!block) return; - switch (v4->ik_type) { + switch (bl->ik_type) { case IKT_1: - *mat = *v4->node[2].mat_ptr; + *out_mat = *bl->node[2].mat_ptr; break; case IKT_2: case IKT_2R: - *mat = *v4->node[3].mat_ptr; + *out_mat = *bl->node[3].mat_ptr; break; } } -static void sub_140419290(rob_chara_bone_data* rob_bone_data, BONE_BLK index, mat4* mat) { - sub_140412860(rob_bone_data->motion_loaded.front(), index, mat); +// 0x140419290 +static void Motion__get_leaf_matrix(rob_chara_bone_data* rob_bone_data, BONE_BLK blk, mat4* out_mat) { + sub_140412860(rob_bone_data->motion_loaded.front(), blk, out_mat); } -static bool sub_14053B580(rob_chara* rob_chr, int32_t a2) { - if (a2 < 0 || a2 > 3) +static bool sub_14053B580(rob_chara* rob_chr, MotLeafCtrlPart part) { + if (part < 0 || part >= LCPART_MAX) return 0; - struc_306& v0 = rob_chr->data.motdata.field_330.field_33C[a2]; - int16_t v7 = v0.field_C; - if (v7 <= 0 || v7 >= 27 || !(v7 < 10 || rob_chr->field_20)) + MotLeafCtrl& leaf_ctrl = rob_chr->rob_base.motdata.leaf_ctrl[part]; + int16_t target_id = leaf_ctrl.target_id; + if (target_id < 0 || target_id >= 27 || !(target_id < LCTAG_OFS || rob_chr->enemy)) return false; - bool v2 = false; - int32_t v8 = v0.field_0; - float_t v9 = rob_chr->data.motion.frame_data.frame; - switch (v8) { - case 0: - if (v9 < v0.frame) + switch (leaf_ctrl.mode) { + case LEAF_CTRL_ON: + if (rob_chr->rob_base.robmot.frame.f < leaf_ctrl.start_frame) return false; break; - case 1: - if (v9 < v0.frame || v9 >= v0.field_8) + case LEAF_CTRL_OFF: + if (rob_chr->rob_base.robmot.frame.f < leaf_ctrl.start_frame + || rob_chr->rob_base.robmot.frame.f >= leaf_ctrl.end_frame) return false; break; default: @@ -9201,124 +9719,124 @@ static bool sub_14053B580(rob_chara* rob_chr, int32_t a2) { } mat4 mat; - sub_140419290(rob_chr->bone_data, rob_ik_hand_leg_bones[a2], &mat); + Motion__get_leaf_matrix(rob_chr->bone_data, lc_part_block_tbl[part], &mat); + vec3 v13; mat4_get_translation(&mat, &v13); vec3 v45; - switch (v0.field_C) { - case 0: - v45 = v0.field_10; + switch (leaf_ctrl.target_id) { + case LCTAG_ABS: + v45 = leaf_ctrl.ofs; break; - case 16: - v45 = v0.field_10 + v13; + case LCTAG_OFS: + v45 = leaf_ctrl.ofs + v13; break; - case 10: { - float_t ratio0 = rob_chr->field_20->bone_data->ik_scale.ratio0; - v45 = v13 * ratio0; + case LCTAG_ADJ_EMY: { + float_t adjust_scale = rob_chr->enemy->bone_data->adjust_scale.base; + v45 = v13 * adjust_scale; } break; - case 11: { - float_t ratio1 = rob_chr->field_20->bone_data->ik_scale.ratio1; - v45 = v13 * ratio1; + case LCTAG_ADJ_EMY_BODY: { + float_t adjust_scale_body = rob_chr->enemy->bone_data->adjust_scale.body; + v45 = v13 * adjust_scale_body; } break; - case 12: { - float_t ratio3 = rob_chr->field_20->bone_data->ik_scale.ratio3; - v45 = v13 * ratio3; + case LCTAG_ADJ_EMY_HEIGHT: { + float_t adjust_scale_height = rob_chr->enemy->bone_data->adjust_scale.height; + v45 = v13 * adjust_scale_height; } break; - case 13: { - float_t ratio0 = rob_chr->bone_data->ik_scale.ratio0; - v45 = v13 * (1.0f / ratio0); + case LCTAG_ADJ_REV: { + float_t adjust_scale = rob_chr->bone_data->adjust_scale.base; + v45 = v13 * (1.0f / adjust_scale); } break; - case 14: { - float_t ratio1 = rob_chr->bone_data->ik_scale.ratio1; - v45 = v13 * (1.0f / ratio1); + case LCTAG_ADJ_BODY_REV: { + float_t adjust_scale_body = rob_chr->bone_data->adjust_scale.body; + v45 = v13 * (1.0f / adjust_scale_body); } break; - case 15: { - float_t ratio3 = rob_chr->bone_data->ik_scale.ratio3; - v45 = v13 * (1.0f / ratio3); + case LCTAG_ADJ_HEIGHT_REV: { + float_t adjust_scale_height = rob_chr->bone_data->adjust_scale.height; + v45 = v13 * (1.0f / adjust_scale_height); } break; default: - if (v0.field_C < 16) { - mat4* v26 = rob_chr->field_20->bone_data->get_mats_mat(dword_140A2DDD0[v0.field_C]); + if (leaf_ctrl.target_id < LCTAG_OFS) { + mat4* v26 = rob_chr->enemy->bone_data->get_mats_mat(lc_target_bone_tbl[leaf_ctrl.target_id]); mat4_get_translation(v26, &v45); - v45 += v0.field_10; + v45 += leaf_ctrl.ofs; } else { - mat4* v23 = rob_chr->field_20->bone_data->get_mats_mat(dword_140A2DDD0[v0.field_C]); + mat4* v23 = rob_chr->enemy->bone_data->get_mats_mat(lc_target_bone_tbl[leaf_ctrl.target_id]); mat4 v49; - mat4_mul_translate(v23, &v0.field_10, &v49); + mat4_mul_translate(v23, &leaf_ctrl.ofs, &v49); mat4_get_translation(&v49, &v45); } break; } - float_t v29 = rob_chr->data.motion.frame_data.frame; - float_t v30 = v0.frame; - if (v29 < v30) - v29 = v0.frame; - else if (v29 > v0.field_8) - v29 = v0.field_8; + float_t v29 = rob_chr->rob_base.robmot.frame.f; + if (v29 < leaf_ctrl.start_frame) + v29 = leaf_ctrl.start_frame; + else if (v29 > leaf_ctrl.end_frame) + v29 = leaf_ctrl.end_frame; float_t v31 = 1.0f; - float_t v32 = v0.field_8 - v30 + 1.0f; + float_t v32 = leaf_ctrl.end_frame - leaf_ctrl.start_frame + 1.0f; if (fabsf(v32) > 0.000001f) { - v31 = (v0.field_8 - v29) / v32; + v31 = (leaf_ctrl.end_frame - v29) / v32; v31 = clamp_def(v31, 0.0f, 1.0f); } - int32_t v33 = v0.field_0; + int32_t v33 = leaf_ctrl.mode; vec3 v48 = 0.0f; - switch (v0.field_0) { - case 0: + switch (leaf_ctrl.mode) { + case LEAF_CTRL_ON: v48 = vec3::lerp(v45, v13, v31); break; - case 1: + case LEAF_CTRL_OFF: v48 = vec3::lerp(v13, v45, v31); break; } - switch (v0.field_E) { - case 1: + switch (leaf_ctrl.limit) { + case LCLIMIT_X: v48.y = v13.y; v48.z = v13.z; break; - case 2: + case LCLIMIT_Y: v48.x = v13.x; v48.z = v13.z; break; - case 3: + case LCLIMIT_Z: v48.x = v13.x; v48.y = v13.y; break; - case 4: + case LCLIMIT_XY: v48.z = v13.z; break; - case 5: + case LCLIMIT_XZ: v48.y = v13.y; break; - case 6: + case LCLIMIT_YZ: v48.x = v13.z; break; } vec3 v36 = v48 - v13; - if (v0.field_1C.x != 0.0f && v36.x < v0.field_1C.x) - v48.x = v0.field_1C.x + v13.x; - else if (v0.field_28.x != 0.0f && v36.x > v0.field_28.x) - v48.x = v0.field_28.x + v13.x; + if (leaf_ctrl.min.x != 0.0f && v36.x < leaf_ctrl.min.x) + v48.x = leaf_ctrl.min.x + v13.x; + else if (leaf_ctrl.max.x != 0.0f && v36.x > leaf_ctrl.max.x) + v48.x = leaf_ctrl.max.x + v13.x; - if (v0.field_1C.y != 0.0f && v36.y < v0.field_1C.y) - v48.y = v0.field_1C.y + v13.y; - else if (v0.field_28.y != 0.0f && v36.y > v0.field_28.y) - v48.y = v0.field_28.y + v13.y; + if (leaf_ctrl.min.y != 0.0f && v36.y < leaf_ctrl.min.y) + v48.y = leaf_ctrl.min.y + v13.y; + else if (leaf_ctrl.max.y != 0.0f && v36.y > leaf_ctrl.max.y) + v48.y = leaf_ctrl.max.y + v13.y; - if (v0.field_1C.z != 0.0f && v36.z < v0.field_1C.z) - v48.z = v0.field_1C.z + v13.z; - else if (v0.field_28.z != 0.0f && v36.z > v0.field_28.z) - v48.z = v0.field_28.z + v13.z; + if (leaf_ctrl.min.z != 0.0f && v36.z < leaf_ctrl.min.z) + v48.z = leaf_ctrl.min.z + v13.z; + else if (leaf_ctrl.max.z != 0.0f && v36.z > leaf_ctrl.max.z) + v48.z = leaf_ctrl.max.z + v13.z; - sub_140418A00(rob_chr->bone_data, v48, off_140C9E000[a2], 0.0f, 0.0f, true); + sub_140418A00(rob_chr->bone_data, v48, recalc_ik_block_tbl[part], 0.0f, 0.0f, true); return true; } @@ -9488,8 +10006,8 @@ LABEL_66: } static void sub_1403FA770(rob_chara_sleeve_adjust* a1) { - mat4* v4 = a1->bones->data()[BLK_C_KATA_L].node[3].mat_ptr; - mat4* v5 = a1->bones->data()[BLK_C_KATA_R].node[3].mat_ptr; + mat4* v4 = (*a1->block_vec)[BLK_C_KATA_L].node[3].mat_ptr; + mat4* v5 = (*a1->block_vec)[BLK_C_KATA_R].node[3].mat_ptr; vec3 v42; mat4_get_translation(v4, &v42); @@ -9551,19 +10069,19 @@ static void sub_1403FA770(rob_chara_sleeve_adjust* a1) { a1->sleeve_r.zmin, a1->sleeve_r.zmax, &a1->field_68, a1->step); if (v16 || v17) { - mat4 mat = *a1->bones->data()[BLK_C_KATA_L].node[2].mat_ptr; + mat4 mat = *(*a1->block_vec)[BLK_C_KATA_L].node[2].mat_ptr; sub_14040AE10(&mat, v42 + v45); - *a1->bones->data()[BLK_C_KATA_L].node[2].mat_ptr = mat; + *(*a1->block_vec)[BLK_C_KATA_L].node[2].mat_ptr = mat; } if (v19 || v18) { - mat4 mat = *a1->bones->data()[BLK_C_KATA_R].node[2].mat_ptr; + mat4 mat = *(*a1->block_vec)[BLK_C_KATA_R].node[2].mat_ptr; sub_14040AE10(&mat, v43 + v44); - *a1->bones->data()[BLK_C_KATA_R].node[2].mat_ptr = mat; + *(*a1->block_vec)[BLK_C_KATA_R].node[2].mat_ptr = mat; } } -static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK block_id) { +static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK blk) { float_t sleeve_radius; float_t sleeve_cyofs; float_t sleeve_czofs; @@ -9574,7 +10092,7 @@ static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK block_id) { float_t sleeve_zmax; vec3 sleeve_mune_ofs; float_t sleeve_mune_rad; - if (block_id == BLK_C_KATA_L) { + if (blk == BLK_C_KATA_L) { sleeve_radius = a1->sleeve_l.radius; sleeve_cyofs = a1->sleeve_l.cyofs; sleeve_czofs = a1->sleeve_l.czofs; @@ -9588,7 +10106,7 @@ static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK block_id) { sleeve_mune_rad = a1->sleeve_l.mune_rad; v6 = &a1->field_74; } - else if (block_id == BLK_C_KATA_R) { + else if (blk == BLK_C_KATA_R) { sleeve_radius = a1->sleeve_r.radius; sleeve_cyofs = a1->sleeve_r.cyofs; sleeve_czofs = a1->sleeve_r.czofs; @@ -9605,8 +10123,8 @@ static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK block_id) { else return; - RobBlock* v15 = a1->bones->data(); - RobNode* v18 = v15[block_id].node; + RobBlock* block_top = a1->block_vec->data(); + RobNode* v18 = block_top[blk].node; mat4* v19 = v18[BLK_KL_HARA_ETC].mat_ptr; vec3 v39; @@ -9616,7 +10134,7 @@ static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK block_id) { sub_1403F9A40(&v37, &v39, v19, sleeve_cyofs, sleeve_czofs); vec3 v40; - mat4* v23 = v15[BLK_KL_MUNE_B_WJ].node->mat_ptr; + mat4* v23 = block_top[BLK_KL_MUNE_B_WJ].node->mat_ptr; mat4_transform_point(v23, &sleeve_mune_ofs, &v40); vec3 v41 = v37 - v40; @@ -9635,13 +10153,13 @@ static void sub_1403F9B20(rob_chara_sleeve_adjust* a1, BONE_BLK block_id) { mat4_transform_vector(v19, v6, &v41); } - mat4* v42 = v15[block_id].node[2].mat_ptr; + mat4* v42 = block_top[blk].node[2].mat_ptr; sub_14040AE10(v42, v39 + v41); } -static void sub_1403FAF30(rob_chara_sleeve_adjust* a1, prj::sys_vector& bones, float_t step) { +static void sub_1403FAF30(rob_chara_sleeve_adjust* a1, prj::sys_vector& block_vec, float_t step) { a1->step = step; - a1->bones = &bones; + a1->block_vec = &block_vec; if (a1->enable1) sub_1403FA770(a1); @@ -9653,121 +10171,119 @@ static void sub_1403FAF30(rob_chara_sleeve_adjust* a1, prj::sys_vector static void sub_14041AB50(rob_chara_bone_data* rob_bone_data) { motion_blend_mot* v2 = rob_bone_data->motion_loaded.front(); - sub_1403FAF30(&rob_bone_data->sleeve_adjust, v2->bone_data.bones, v2->mot_play_data.frame_data.step); + sub_1403FAF30(&rob_bone_data->sleeve_adjust, v2->bone_data.block_vec, v2->mot_play_data.frame_data.step); } static bool rob_chara_hands_adjust(rob_chara* rob_chr) { rob_chara_set_hands_adjust(rob_chr); bool v2 = false; - if (sub_14053ACA0(rob_chr, 0) || sub_14053B580(rob_chr, 1)) + if (sub_14053ACA0(rob_chr, 0) || sub_14053B580(rob_chr, LCPART_TE_L)) v2 = true; - if (sub_14053ACA0(rob_chr, 1) || sub_14053B580(rob_chr, 0)) + if (sub_14053ACA0(rob_chr, 1) || sub_14053B580(rob_chr, LCPART_TE_R)) v2 = true; sub_14041AB50(rob_chr->bone_data); return v2; } -static float_t sub_140406E90(RobBlock* a1, RobBlock* a2, float_t a3, vec3* a4) { - vec3 v18 = 0.0f; - mat4_transform_point(a1->node[3].mat_ptr, &v18, &v18); - *a4 = v18; +// 0x140406E90 +static float_t get_ashi_pos(const RobBlock& bl_momo, const RobBlock& bl_toe, float_t hh, vec3& pos) { + vec3 asi_pos = 0.0f; + mat4_transform_point(bl_momo.node[3].mat_ptr, &asi_pos, &asi_pos); + pos = asi_pos; - vec3 v17; - v17.x = 0.01f; - v17.y = -0.05f; - v17.z = 0.0f; - mat4_transform_point(a2->node[0].mat_ptr, &v18, &v17); - - if (v18.y - a3 <= v17.y) - return v18.y - a3; - return v17.y; + vec3 toe_pos(0.01f, -0.05f, 0.0f); + mat4_transform_point(bl_toe.node[0].mat_ptr, &toe_pos, &toe_pos); + return min_def(asi_pos.y - hh, toe_pos.y); } -static void sub_140406920(struc_936* a1, RobBlock* a2, RobBlock* a3, float_t heel_height, vec3* a5, float_t step) { - vec3 v18; - float_t v7 = sub_140406E90(a2, a3, heel_height, &v18); - float_t v8 = task_stage_current_get_floor_height(v18, heel_height); - if (a5->y != v8) { - a5->x = a5->y; - a5->z = 0.0f; - } - a5->y = v8; +// 0x140406920 +void Motion::AshiOidashiColle::calc_sub(RobBlock& bl_momo, const RobBlock& bl_toe, + float_t hh, Motion::AshiOidashi& ashi, float_t step) { + vec3 ashi_pos; + float_t toe_pos_y = get_ashi_pos(bl_momo, bl_toe, hh, ashi_pos); - a5->z = step * 10.0f + a5->z; - if (a5->z > 1.0f) { - a5->x = v8; - a5->z = 1.0f; + float_t y = task_stage_current_get_floor_height(ashi_pos, hh); + if (ashi.y_old != y) { + ashi.y_bef = ashi.y_old; + ashi.scale = 0.0f; + } + ashi.y_old = y; + + ashi.scale += step * 10.0f; + if (ashi.scale > 1.0f) { + ashi.y_bef = y; + ashi.scale = 1.0f; } - float_t v11 = v8 - v7; - float_t v12 = a5->x - v7; - if (v11 < 0.0f) - v11 = 0.0f; - if (v12 < 0.0f) - v12 = 0.0f; + float_t y_diff = y - toe_pos_y; + float_t y_bef_diff = ashi.y_bef - toe_pos_y; + if (y_diff < 0.0f) + y_diff = 0.0f; + if (y_bef_diff < 0.0f) + y_bef_diff = 0.0f; - a2->leaf_pos[1].x = v18.x; - a2->leaf_pos[1].y = v18.y + lerp_def(v12, v11, a5->z); - a2->leaf_pos[1].z = v18.z; + bl_momo.leaf_pos[0].x = ashi_pos.x; + bl_momo.leaf_pos[0].y = ashi_pos.y + lerp_def(y_bef_diff, y_diff, ashi.scale); + bl_momo.leaf_pos[0].z = ashi_pos.z; } -static void sub_1404065B0(struc_936* a1, prj::sys_vector* a2, const mat4& mat, float_t a4, - BONE_KIND skeleton_type, const BONE_BLK* a6, const BONE_BLK* a7) { +// 0x1404065B0 +void Motion::AshiOidashiColle::calc(prj::sys_vector& block_vec, const mat4& cur_mat, + float_t step, BONE_KIND kind, const BONE_BLK* c_momo_l_ik_blk, const BONE_BLK* c_momo_r_ik_blk) { data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; - const float_t* heel_height = aft_bone_data->get_heel_height(skeleton_type); - if (!heel_height) + const RobBlock* block_top = block_vec.data(); + const float_t* hh = aft_bone_data->get_heel_height(kind); + if (!hh) return; - sub_140406920(a1, &a2->data()[a6[0]], &a2->data()[BLK_KL_TOE_L_WJ], *heel_height, &a1->toe_l, a4); - sub_140406920(a1, &a2->data()[a7[0]], &a2->data()[BLK_KL_TOE_R_WJ], *heel_height, &a1->toe_r, a4); + calc_sub(block_vec[c_momo_l_ik_blk[0]], block_vec[BLK_KL_TOE_L_WJ], *hh, l, step); + calc_sub(block_vec[c_momo_r_ik_blk[0]], block_vec[BLK_KL_TOE_R_WJ], *hh, r, step); - RobBlock* v7 = a2->data(); - RobBlock* v17 = &v7[a6[0]]; - v17->chain_rot[1] = mat4_identity; - v17->chain_rot[2] = mat4_identity; - v17->get_mat_ik(1); + RobBlock& bl_momo_l = block_vec[c_momo_l_ik_blk[0]]; + bl_momo_l.chain_rot[1] = mat4_identity; + bl_momo_l.chain_rot[2] = mat4_identity; + bl_momo_l.solve_ik(1); - RobBlock* v20 = &v7[a7[0]]; - v20->chain_rot[1] = mat4_identity; - v20->chain_rot[2] = mat4_identity; - v20->get_mat_ik(1); + RobBlock& bl_momo_r = block_vec[c_momo_r_ik_blk[0]]; + bl_momo_r.chain_rot[1] = mat4_identity; + bl_momo_r.chain_rot[2] = mat4_identity; + bl_momo_r.solve_ik(1); - BONE_BLK v21 = a6[1]; + c_momo_l_ik_blk++; + while (*c_momo_l_ik_blk != BLK_DUMMY) + block_vec[*c_momo_l_ik_blk++].recalc_fk_block(cur_mat, block_top, true); - a6++; - while (*a6 != BLK_DUMMY) - v7[*a6++].mult_mat(mat, v7, true); - - a7++; - while (*a7 != BLK_DUMMY) - v7[*a7++].mult_mat(mat, v7, true); + c_momo_r_ik_blk++; + while (*c_momo_r_ik_blk != BLK_DUMMY) + block_vec[*c_momo_r_ik_blk++].recalc_fk_block(cur_mat, block_top, true); } -static void sub_140418810(rob_chara_bone_data* rob_bone_data, const BONE_BLK* a6, const BONE_BLK* a7) { - motion_blend_mot* v3 = rob_bone_data->motion_loaded.front(); - mat4 m = v3->field_4F8.mat; - sub_1404065B0(&rob_bone_data->field_76C, &v3->bone_data.bones, m, - v3->mot_play_data.frame_data.step, rob_bone_data->skeleton_type, a6, a7); +static void sub_140418810(rob_chara_bone_data* rob_bone_data, const BONE_BLK* c_momo_l_ik_blk, const BONE_BLK* c_momo_r_ik_blk) { + motion_blend_mot* mot = rob_bone_data->motion_loaded.front(); + mat4 cur_mat = mot->smooth.base_mtx; + rob_bone_data->ashi_oidashi.calc( + mot->bone_data.block_vec, cur_mat, mot->mot_play_data.frame_data.step, + rob_bone_data->disp_kind, c_momo_l_ik_blk, c_momo_r_ik_blk); } static void sub_14053B260(rob_chara* rob_chr) { - if (rob_chr->data.motdata.field_0.field_20.field_C & 0x10000000) - sub_140418810(rob_chr->bone_data, dword_140A2DDB0, dword_140A2DD90); + if (rob_chr->rob_base.motdata.motkind[MK_CATCH_SABAKI_DISABLE]) + sub_140418810(rob_chr->bone_data, recalc_ik_block_tbl[3], recalc_ik_block_tbl[2]); } static void rob_chara_set_hand_l_object(rob_chara* rob_chr, object_info obj_info, int32_t type) { switch (type) { case 0: default: - rob_chr->data.motion.field_150.hand_l_object = obj_info; + rob_chr->rob_base.robmot.field_150.hand_l_object = obj_info; break; case 1: - rob_chr->data.motion.hand_l_object = obj_info; + rob_chr->rob_base.robmot.hand_l_object = obj_info; break; case 2: - rob_chr->data.motion.field_3B0.hand_l_object = obj_info; + rob_chr->rob_base.robmot.field_3B0.hand_l_object = obj_info; break; } } @@ -9776,112 +10292,112 @@ static void rob_chara_set_hand_r_object(rob_chara* rob_chr, object_info obj_info switch (type) { case 0: default: - rob_chr->data.motion.field_150.hand_r_object = obj_info; + rob_chr->rob_base.robmot.field_150.hand_r_object = obj_info; break; case 1: - rob_chr->data.motion.hand_r_object = obj_info; + rob_chr->rob_base.robmot.hand_r_object = obj_info; break; case 2: - rob_chr->data.motion.field_3B0.hand_r_object = obj_info; + rob_chr->rob_base.robmot.field_3B0.hand_r_object = obj_info; break; } } static void rob_chara_age_age_ctrl(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, mat4& mat) { - arr[chara_id * 3 + part_id].ctrl(mat); + int32_t rob_id, int32_t part, mat4& mat) { + arr[rob_id * 3 + part].ctrl(mat); } static void rob_chara_age_age_disp(rob_chara_age_age* arr, - render_context* rctx, int32_t chara_id, bool reflect, bool chara_color) { + render_context* rctx, int32_t rob_id, bool reflect, bool chara_color) { bool npr = !!rctx->render_manager->npr_param; mat4& view = rctx->camera->view; vec3 v11 = { view.row0.z, view.row1.z, view.row2.z }; - arr[chara_id * 3 + 0].disp(rctx, chara_id, npr, reflect, v11, chara_color); - arr[chara_id * 3 + 1].disp(rctx, chara_id, npr, reflect, v11, chara_color); - arr[chara_id * 3 + 2].disp(rctx, chara_id, npr, reflect, v11, chara_color); + arr[rob_id * 3 + 0].disp(rctx, rob_id, npr, reflect, v11, chara_color); + arr[rob_id * 3 + 1].disp(rctx, rob_id, npr, reflect, v11, chara_color); + arr[rob_id * 3 + 2].disp(rctx, rob_id, npr, reflect, v11, chara_color); } static void rob_chara_age_age_load(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id) { - if (part_id != 1 && part_id != 2) + int32_t rob_id, int32_t part) { + if (part != 1 && part != 2) return; rob_chara_age_age_data data[10]; for (rob_chara_age_age_data& i : data) { i.index = (int32_t)(&i - data); i.remaining = -1.0f; - i.part_id = part_id; + i.part = part; } - arr[chara_id * 3 + part_id].load({ 0, 3291 }, data, 10); + arr[rob_id * 3 + part].load({ 0, 3291 }, data, 10); } -static void rob_chara_age_age_reset(rob_chara_age_age* arr, int32_t chara_id) { - arr[chara_id * 3 + 0].reset(); - arr[chara_id * 3 + 1].reset(); - arr[chara_id * 3 + 2].reset(); +static void rob_chara_age_age_reset(rob_chara_age_age* arr, int32_t rob_id) { + arr[rob_id * 3 + 0].reset(); + arr[rob_id * 3 + 1].reset(); + arr[rob_id * 3 + 2].reset(); } static void rob_chara_age_age_set_alpha(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value) { - arr[chara_id * 3 + part_id].set_alpha(value); + int32_t rob_id, int32_t part, float_t value) { + arr[rob_id * 3 + part].set_alpha(value); } static void rob_chara_age_age_set_disp(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, bool value) { - arr[chara_id * 3 + part_id].set_disp(value); + int32_t rob_id, int32_t part, bool value) { + arr[rob_id * 3 + part].set_disp(value); } static void rob_chara_age_age_set_move_cancel(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value) { - arr[chara_id * 3 + part_id].set_move_cancel(value); + int32_t rob_id, int32_t part, float_t value) { + arr[rob_id * 3 + part].set_move_cancel(value); } static void rob_chara_age_age_set_npr(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, bool value) { - arr[chara_id * 3 + part_id].set_npr(value); + int32_t rob_id, int32_t part, bool value) { + arr[rob_id * 3 + part].set_npr(value); } static void rob_chara_age_age_set_speed(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value) { - arr[chara_id * 3 + part_id].set_speed(value); + int32_t rob_id, int32_t part, float_t value) { + arr[rob_id * 3 + part].set_speed(value); } static void rob_chara_age_age_set_skip(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id) { - arr[chara_id * 3 + part_id].set_skip(); + int32_t rob_id, int32_t part) { + arr[rob_id * 3 + part].set_skip(); } static void rob_chara_age_age_set_step(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id, float_t value) { - arr[chara_id * 3 + part_id].set_step(value); + int32_t rob_id, int32_t part, float_t value) { + arr[rob_id * 3 + part].set_step(value); } static void rob_chara_age_age_set_step_full(rob_chara_age_age* arr, - int32_t chara_id, int32_t part_id) { - arr[chara_id * 3 + part_id].set_step_full(); + int32_t rob_id, int32_t part) { + arr[rob_id * 3 + part].set_step_full(); } static void rob_chara_bone_data_calculate_bones(rob_chara_bone_data* rob_bone_data, - const std::vector* bones) { - bone_database_bones_calculate_count(bones, rob_bone_data->object_bone_count, - rob_bone_data->motion_bone_count, rob_bone_data->node_count, - rob_bone_data->leaf_pos, rob_bone_data->chain_pos); + const std::vector* body_type_table) { + bone_database_bones_calculate_count(body_type_table, rob_bone_data->mat_max, + rob_bone_data->block_max, rob_bone_data->node_max, + rob_bone_data->leaf_pos_max, rob_bone_data->chain_pos_max); } -static void rob_chara_bone_data_get_ik_scale( +static void rob_chara_bone_data_get_adjust_scale( rob_chara_bone_data* rob_bone_data, const bone_database* bone_data) { if (rob_bone_data->motion_loaded.size() < 0) return; motion_blend_mot* v2 = rob_bone_data->motion_loaded.front(); - rob_chara_bone_data_ik_scale_calculate(&rob_bone_data->ik_scale, v2->bone_data.bones, - rob_bone_data->base_skeleton_type, rob_bone_data->skeleton_type, bone_data); - float_t ratio0 = rob_bone_data->ik_scale.ratio0; - v2->field_4F8.field_C0 = ratio0; - v2->field_4F8.field_C4 = ratio0; - v2->field_4F8.field_C8 = 0.0f; + rob_chara_bone_data_adjust_scale_calculate(&rob_bone_data->adjust_scale, v2->bone_data.block_vec, + rob_bone_data->kind, rob_bone_data->disp_kind, bone_data); + float_t base = rob_bone_data->adjust_scale.base; + v2->smooth.field_C0 = base; + v2->smooth.field_C4 = base; + v2->smooth.field_C8 = 0.0f; } static mat4* rob_chara_bone_data_get_mat(rob_chara_bone_data* rob_bone_data, size_t index) { @@ -9892,68 +10408,70 @@ static mat4* rob_chara_bone_data_get_mat(rob_chara_bone_data* rob_bone_data, siz } static RobNode* rob_chara_bone_data_get_node(rob_chara_bone_data* rob_bone_data, size_t index) { - if (index < rob_bone_data->nodes.size()) - return &rob_bone_data->nodes[index]; + if (index < rob_bone_data->node_vec.size()) + return &rob_bone_data->node_vec[index]; return 0; } -static void rob_chara_bone_data_ik_scale_calculate( - rob_chara_bone_data_ik_scale* ik_scale, prj::sys_vector& bones, - BONE_KIND base_skeleton_type, BONE_KIND skeleton_type, const bone_database* bone_data) { - const float_t* base_heel_height = bone_data->get_heel_height(base_skeleton_type); - const float_t* heel_height = bone_data->get_heel_height(skeleton_type); - if (!base_heel_height || !heel_height) +static void rob_chara_bone_data_adjust_scale_calculate( + rob_chara_bone_data_adjust_scale* adjust_scale, prj::sys_vector& block_vec, + BONE_KIND kind, BONE_KIND disp_kind, const bone_database* bone_data) { + const float_t* heel_height = bone_data->get_heel_height(kind); + const float_t* disp_heel_height = bone_data->get_heel_height(disp_kind); + if (!heel_height || !disp_heel_height) return; - RobBlock* b_cl_mune = &bones[BLK_CL_MUNE]; - RobBlock* b_kl_kubi = &bones[BLK_KL_KUBI]; - RobBlock* b_c_kata_l = &bones[BLK_C_KATA_L]; - RobBlock* b_cl_momo_l = &bones[BLK_CL_MOMO_L]; + RobBlock* b_cl_mune = &block_vec[BLK_CL_MUNE]; + RobBlock* b_kl_kubi = &block_vec[BLK_KL_KUBI]; + RobBlock* b_c_kata_l = &block_vec[BLK_C_KATA_L]; + RobBlock* b_cl_momo_l = &block_vec[BLK_CL_MOMO_L]; - float_t base_height = fabsf(b_cl_momo_l->chain_pos[0].y) + b_cl_momo_l->len[0][0] - + b_cl_momo_l->len[1][0] + *base_heel_height; - float_t height = fabsf(b_cl_momo_l->chain_pos[1].y) + b_cl_momo_l->len[0][1] - + b_cl_momo_l->len[1][1] + *heel_height; - ik_scale->ratio0 = height / base_height; - ik_scale->ratio1 = (fabsf(b_kl_kubi->chain_pos[1].y) + b_cl_mune->len[0][1]) + float_t height = fabsf(b_cl_momo_l->chain_pos[0].y) + + b_cl_momo_l->len[0][0] + b_cl_momo_l->len[1][0] + *heel_height; + float_t disp_height = fabsf(b_cl_momo_l->chain_pos[1].y) + + b_cl_momo_l->len[0][1] + b_cl_momo_l->len[1][1] + *disp_heel_height; + adjust_scale->base = disp_height / height; + adjust_scale->body + = (fabsf(b_kl_kubi->chain_pos[1].y) + b_cl_mune->len[0][1]) / (fabsf(b_kl_kubi->chain_pos[0].y) + b_cl_mune->len[0][0]); - ik_scale->ratio2 = (b_c_kata_l->len[0][1] + b_c_kata_l->len[1][1]) + adjust_scale->arm = (b_c_kata_l->len[0][1] + b_c_kata_l->len[1][1]) / (b_c_kata_l->len[0][0] + b_c_kata_l->len[1][0]); - ik_scale->ratio3 = (fabsf(b_kl_kubi->chain_pos[1].y) + b_cl_mune->len[0][1] + height) - / (fabsf(b_kl_kubi->chain_pos[0].y) + b_cl_mune->len[0][0] + base_height); + adjust_scale->height + = (fabsf(b_kl_kubi->chain_pos[1].y) + b_cl_mune->len[0][1] + disp_height) + / (fabsf(b_kl_kubi->chain_pos[0].y) + b_cl_mune->len[0][0] + height); } -static bool motion_blend_mot_check(BONE_BLK bone_index) { +static bool motion_blend_mot_check(BONE_BLK blk) { return true; } -static bool partial_motion_blend_mot_face_check(BONE_BLK bone_index) { - return bone_index >= BLK_FACE_ROOT && bone_index <= BLK_TL_TOOTH_UPPER_WJ; +static bool partial_motion_blend_mot_face_check(BONE_BLK blk) { + return blk >= BLK_FACE_ROOT && blk <= BLK_TL_TOOTH_UPPER_WJ; } -static bool partial_motion_blend_mot_hand_l_check(BONE_BLK bone_index) { - return bone_index >= BLK_N_HITO_L_EX && bone_index <= BLK_NL_OYA_C_L_WJ; +static bool partial_motion_blend_mot_hand_l_check(BONE_BLK blk) { + return blk >= BLK_N_HITO_L_EX && blk <= BLK_NL_OYA_C_L_WJ; } -static bool partial_motion_blend_mot_hand_r_check(BONE_BLK bone_index) { - return bone_index >= BLK_N_HITO_R_EX && bone_index <= BLK_NL_OYA_C_R_WJ; +static bool partial_motion_blend_mot_hand_r_check(BONE_BLK blk) { + return blk >= BLK_N_HITO_R_EX && blk <= BLK_NL_OYA_C_R_WJ; } -static bool partial_motion_blend_mot_mouth_check(BONE_BLK bone_index) { - return bone_index >= BLK_N_AGO && bone_index <= BLK_TL_TOOTH_UNDER_WJ - || bone_index >= BLK_N_KUTI_D && bone_index <= BLK_TL_KUTI_U_R_WJ - || bone_index >= BLK_N_TOOTH_UPPER && bone_index <= BLK_TL_TOOTH_UPPER_WJ; +static bool partial_motion_blend_mot_mouth_check(BONE_BLK blk) { + return blk >= BLK_N_AGO && blk <= BLK_TL_TOOTH_UNDER_WJ + || blk >= BLK_N_KUTI_D && blk <= BLK_TL_KUTI_U_R_WJ + || blk >= BLK_N_TOOTH_UPPER && blk <= BLK_TL_TOOTH_UPPER_WJ; } -static bool partial_motion_blend_mot_eyes_check(BONE_BLK bone_index) { - return bone_index >= BLK_N_EYE_L && bone_index <= BLK_KL_HIGHLIGHT_R_WJ; +static bool partial_motion_blend_mot_eyes_check(BONE_BLK blk) { + return blk >= BLK_N_EYE_L && blk <= BLK_KL_HIGHLIGHT_R_WJ; } -static bool partial_motion_blend_mot_eyelid_check(BONE_BLK bone_index) { - if (bone_index >= BLK_N_MABU_L_D_A && bone_index <= BLK_TL_MABU_R_U_C_WJ - || bone_index >= BLK_N_EYELID_L_A && bone_index <= BLK_TL_EYELID_R_B_WJ) +static bool partial_motion_blend_mot_eyelid_check(BONE_BLK blk) { + if (blk >= BLK_N_MABU_L_D_A && blk <= BLK_TL_MABU_R_U_C_WJ + || blk >= BLK_N_EYELID_L_A && blk <= BLK_TL_EYELID_R_B_WJ) return true; - return partial_motion_blend_mot_eyes_check(bone_index); + return partial_motion_blend_mot_eyes_check(blk); } static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, @@ -9962,34 +10480,33 @@ static void rob_chara_bone_data_init_data(rob_chara_bone_data* rob_bone_data, for (motion_blend_mot*& i : rob_bone_data->motions) i->init(rob_bone_data, motion_blend_mot_check, bone_data); - size_t motion_bone_count = rob_bone_data->motion_bone_count; - rob_bone_data->face.init(base_type, partial_motion_blend_mot_face_check, motion_bone_count, bone_data); - rob_bone_data->hand_l.init(base_type, partial_motion_blend_mot_hand_l_check, motion_bone_count, bone_data); - rob_bone_data->hand_r.init(base_type, partial_motion_blend_mot_hand_r_check, motion_bone_count, bone_data); - rob_bone_data->mouth.init(base_type, partial_motion_blend_mot_mouth_check, motion_bone_count, bone_data); - rob_bone_data->eyes.init(base_type, partial_motion_blend_mot_eyes_check, motion_bone_count, bone_data); - rob_bone_data->eyelid.init(base_type, partial_motion_blend_mot_eyelid_check, motion_bone_count, bone_data); + size_t block_max = rob_bone_data->block_max; + rob_bone_data->face.init(base_type, partial_motion_blend_mot_face_check, block_max, bone_data); + rob_bone_data->hand_l.init(base_type, partial_motion_blend_mot_hand_l_check, block_max, bone_data); + rob_bone_data->hand_r.init(base_type, partial_motion_blend_mot_hand_r_check, block_max, bone_data); + rob_bone_data->mouth.init(base_type, partial_motion_blend_mot_mouth_check, block_max, bone_data); + rob_bone_data->eyes.init(base_type, partial_motion_blend_mot_eyes_check, block_max, bone_data); + rob_bone_data->eyelid.init(base_type, partial_motion_blend_mot_eyelid_check, block_max, bone_data); } static void rob_chara_bone_data_init_skeleton(rob_chara_bone_data* rob_bone_data, - BONE_KIND base_skeleton_type, BONE_KIND skeleton_type, const bone_database* bone_data) { - if (rob_bone_data->base_skeleton_type == base_skeleton_type - && rob_bone_data->skeleton_type == skeleton_type) + BONE_KIND kind, BONE_KIND disp_kind, const bone_database* bone_data) { + if (rob_bone_data->kind == kind + && rob_bone_data->disp_kind == disp_kind) return; - const char* name = bone_database_skeleton_type_to_string(base_skeleton_type); - const std::vector* bones = bone_data->get_body_type(name); - const std::vector* parent_indices = bone_data->get_parent_node(name); - const std::vector* motion_bones = bone_data->get_bone_node_name(name); - if (!bones || !parent_indices || !motion_bones) + const std::vector* body_type_table = bone_data->get_body_type_table(kind); + const std::vector* node_parent_table = bone_data->get_node_parent_table(kind); + const std::vector* bone_node_name_table = bone_data->get_bone_node_name_table(kind); + if (!body_type_table || !node_parent_table || !bone_node_name_table) return; - rob_chara_bone_data_calculate_bones(rob_bone_data, bones); + rob_chara_bone_data_calculate_bones(rob_bone_data, body_type_table); rob_chara_bone_data_reserve(rob_bone_data); - rob_chara_bone_data_set_mats(rob_bone_data, bones, motion_bones->data()); - rob_chara_bone_data_set_parent_mats(rob_bone_data, parent_indices->data()); - rob_bone_data->base_skeleton_type = base_skeleton_type; - rob_bone_data->skeleton_type = skeleton_type; + rob_chara_bone_data_set_mats(rob_bone_data, body_type_table, bone_node_name_table->data()); + rob_chara_bone_data_set_parent_mats(rob_bone_data, node_parent_table->data()); + rob_bone_data->kind = kind; + rob_bone_data->disp_kind = disp_kind; } static void sub_14041B4E0(prj::sys_vector& vec) { @@ -10112,15 +10629,15 @@ static bool sub_1404136B0(motion_blend_mot* a1) { return false; } -static bool sub_140413630(struc_308* a1) { +static bool sub_140413630(MotionSmooth* a1) { return (a1->field_4 & 2) != 0; } -static bool sub_140413790(struc_308* a1) { +static bool sub_140413790(MotionSmooth* a1) { return (a1->field_0 & 2) != 0; } -static bool sub_1404137A0(struc_308* a1) { +static bool sub_1404137A0(MotionSmooth* a1) { return (a1->field_0 & 0x10) != 0; } @@ -10133,14 +10650,14 @@ static void sub_140415A10(motion_blend_mot* a1) { v7.field_2 = false; v7.field_3 = false; v7.field_4 = false; - if (!a1->field_4F8.field_BD) - v7.field_0 = !sub_140413630(&a1->field_4F8); - if (!a1->field_4F8.field_BC) - v7.field_2 = !sub_140413790(&a1->field_4F8); - v7.field_1 = sub_1404137A0(&a1->field_4F8); + if (!a1->smooth.root_xzpos) + v7.field_0 = !sub_140413630(&a1->smooth); + if (!a1->smooth.root_ypos) + v7.field_2 = !sub_140413790(&a1->smooth); + v7.field_1 = sub_1404137A0(&a1->smooth); v7.frame = a1->mot_key_data.frame; - v7.rot_y = a1->field_4F8.rot_y; - v7.prev_rot_y = a1->field_4F8.prev_rot_y; + v7.move_yang = a1->smooth.move_yang; + v7.move_yang_bef = a1->smooth.move_yang_bef; a1->blend->Step(&v7); } @@ -10156,8 +10673,8 @@ static void sub_140415B30(partial_motion_blend_mot* a1) { v3.field_3 = false; v3.field_4 = false; v3.frame = 0.0f; - v3.rot_y = 0.0f; - v3.prev_rot_y = 0.0f; + v3.move_yang = 0.0f; + v3.move_yang_bef = 0.0f; a1->blend.Step(&v3); } @@ -10227,20 +10744,20 @@ static void rob_chara_bone_data_motion_blend_mot_list_init(rob_chara_bone_data* } static void rob_chara_bone_data_reserve(rob_chara_bone_data* rob_bone_data) { - rob_bone_data->mats.clear(); - rob_bone_data->mats.resize(rob_bone_data->object_bone_count); + rob_bone_data->mat_vec.clear(); + rob_bone_data->mat_vec.resize(rob_bone_data->mat_max); - for (mat4& i : rob_bone_data->mats) + for (mat4& i : rob_bone_data->mat_vec) i = mat4_identity; - rob_bone_data->mats2.clear(); - rob_bone_data->mats2.resize(rob_bone_data->node_count - rob_bone_data->object_bone_count); + rob_bone_data->mat2_vec.clear(); + rob_bone_data->mat2_vec.resize(rob_bone_data->node_max - rob_bone_data->mat_max); - for (mat4& i : rob_bone_data->mats2) + for (mat4& i : rob_bone_data->mat2_vec) i = mat4_identity; - rob_bone_data->nodes.clear(); - rob_bone_data->nodes.resize(rob_bone_data->node_count); + rob_bone_data->node_vec.clear(); + rob_bone_data->node_vec.resize(rob_bone_data->node_max); } static void sub_14041AE40(rob_chara_bone_data* rob_bone_data) { @@ -10289,7 +10806,7 @@ static void sub_14041BA60(rob_chara_bone_data* rob_bone_data) { rob_bone_data->motion_loaded.front()->enabled_bones.check(); } -static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, uint32_t motion_id, +static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, uint32_t motnum, MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db) { if (!rob_bone_data->motion_loaded.size()) return; @@ -10298,7 +10815,7 @@ static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); sub_14041AE40(rob_bone_data); rob_bone_data->motion_loaded.front()->load_file( - motion_id, MOTION_BLEND_FREEZE, 1.0f, bone_data, mot_db); + motnum, MOTION_BLEND_FREEZE, 1.0f, bone_data, mot_db); sub_14041BA60(rob_bone_data); return; } @@ -10308,7 +10825,7 @@ static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, blend_type = MOTION_BLEND; rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); rob_bone_data->motion_loaded.front()->load_file( - motion_id, blend_type, 1.0f, bone_data, mot_db); + motnum, blend_type, 1.0f, bone_data, mot_db); return; } rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 2); @@ -10317,7 +10834,7 @@ static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, rob_chara_bone_data_motion_blend_mot_list_init(rob_bone_data); rob_bone_data->motion_loaded.front()->copy_rot_trans(); rob_bone_data->motion_loaded.front()->load_file( - motion_id, MOTION_BLEND_CROSS, 1.0f, bone_data, mot_db); + motnum, MOTION_BLEND_CROSS, 1.0f, bone_data, mot_db); return; } @@ -10327,7 +10844,7 @@ static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, rob_chara_bone_data_motion_blend_mot_list_free(rob_bone_data, 1); sub_14041AE40(rob_bone_data); rob_bone_data->motion_loaded.front()->load_file( - motion_id, MOTION_BLEND_FREEZE, 1.0f, bone_data, mot_db); + motnum, MOTION_BLEND_FREEZE, 1.0f, bone_data, mot_db); sub_14041BA60(rob_bone_data); return; } @@ -10336,7 +10853,7 @@ static void rob_chara_bone_data_motion_load(rob_chara_bone_data* rob_bone_data, rob_bone_data->motion_loaded_indices.push_back(rob_bone_data->motions.size()); rob_bone_data->motion_loaded.front()->copy_rot_trans(); rob_bone_data->motion_loaded.front()->load_file( - motion_id, MOTION_BLEND_CROSS, 1.0f, bone_data, mot_db); + motnum, MOTION_BLEND_CROSS, 1.0f, bone_data, mot_db); } static void rob_chara_bone_data_set_look_anim_param(rob_chara_bone_data* rob_bone_data, @@ -10376,60 +10893,55 @@ static void rob_chara_bone_data_set_look_anim_param(rob_chara_bone_data* rob_bon float_t eyes_xrot_adjust_neg = v1_neg * v2_neg; float_t eyes_xrot_adjust_pos = v1_pos * v2_pos; for (motion_blend_mot*& i : rob_bone_data->motions) { - RobBlock* data = i->bone_data.bones.data(); - data[BLK_KL_EYE_L].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; - data[BLK_KL_EYE_L].eyes_xrot_adjust_pos = eyes_xrot_adjust_pos; - data[BLK_KL_EYE_R].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; - data[BLK_KL_EYE_R].eyes_xrot_adjust_pos = eyes_xrot_adjust_pos; + RobBlock* block_top = i->bone_data.block_vec.data(); + block_top[BLK_KL_EYE_L].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; + block_top[BLK_KL_EYE_L].eyes_xrot_adjust_pos = eyes_xrot_adjust_pos; + block_top[BLK_KL_EYE_R].eyes_xrot_adjust_neg = eyes_xrot_adjust_neg; + block_top[BLK_KL_EYE_R].eyes_xrot_adjust_pos = eyes_xrot_adjust_pos; } rob_bone_data->look_anim.set_eyes_xrot_adjust(eyes_xrot_adjust_neg, eyes_xrot_adjust_pos); } static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, - const std::vector* bones, const std::string* motion_bones) { + const std::vector* body_type_table, const std::string* bone_node_name_table) { size_t node = 0; - size_t matrix = 0; - size_t matrix2 = 0; + size_t mat = 0; + size_t mat2 = 0; size_t leaf_pos = 0; size_t chain_pos = 0; - RobNode* nodes = rob_bone_data->nodes.data(); - for (const BODYTYPE& i : *bones) { + RobNode* n = rob_bone_data->node_vec.data(); + for (const BODYTYPE& i : *body_type_table) { chain_pos++; switch (i.ik_type) { case IKT_0: case IKT_0N: case IKT_0T: - nodes->mat_ptr = &rob_bone_data->mats[matrix++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat_vec[mat++]; + n->name = bone_node_name_table[node].c_str(); + n++; break; case IKT_ROOT: - nodes->mat_ptr = &rob_bone_data->mats[matrix++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat_vec[mat++]; + n->name = bone_node_name_table[node].c_str(); + n++; leaf_pos++; break; case IKT_1: - nodes->mat_ptr = &rob_bone_data->mats2[matrix2++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat2_vec[mat2++]; + n->name = bone_node_name_table[node].c_str(); + n++; - nodes->mat_ptr = &rob_bone_data->mats[matrix++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat_vec[mat++]; + n->name = bone_node_name_table[node + 1].c_str(); + n++; - nodes->mat_ptr = &rob_bone_data->mats2[matrix2++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat2_vec[mat2++]; + n->name = bone_node_name_table[node + 2].c_str(); + n++; chain_pos++; leaf_pos++; @@ -10437,25 +10949,21 @@ static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, break; case IKT_2: case IKT_2R: - nodes->mat_ptr = &rob_bone_data->mats[matrix++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat_vec[mat++]; + n->name = bone_node_name_table[node].c_str(); + n++; - nodes->mat_ptr = &rob_bone_data->mats[matrix++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat_vec[mat++]; + n->name = bone_node_name_table[node + 1].c_str(); + n++; - nodes->mat_ptr = &rob_bone_data->mats[matrix++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat_vec[mat++]; + n->name = bone_node_name_table[node + 2].c_str(); + n++; - nodes->mat_ptr = &rob_bone_data->mats2[matrix2++]; - nodes->name = motion_bones->c_str(); - nodes++; - motion_bones++; + n->mat_ptr = &rob_bone_data->mat2_vec[mat2++]; + n->name = bone_node_name_table[node + 3].c_str(); + n++; chain_pos += 2; leaf_pos++; @@ -10465,63 +10973,63 @@ static void rob_chara_bone_data_set_mats(rob_chara_bone_data* rob_bone_data, node++; } - for (RobNode& i : rob_bone_data->nodes) + for (RobNode& i : rob_bone_data->node_vec) i.no_scale_mat = i.mat_ptr; - if (node != rob_bone_data->node_count) + if (node != rob_bone_data->node_max) printf_debug_error("Node mismatch"); - if (matrix != rob_bone_data->object_bone_count) + if (mat != rob_bone_data->mat_max) printf_debug_error("Matrix mismatch"); - if (matrix2 != rob_bone_data->node_count - rob_bone_data->object_bone_count) + if (mat2 != rob_bone_data->node_max - rob_bone_data->mat_max) printf_debug_error("Matrix2 mismatch"); - if (leaf_pos != rob_bone_data->leaf_pos) + if (leaf_pos != rob_bone_data->leaf_pos_max) printf_debug_error("LeafPos mismatch"); - if (chain_pos != rob_bone_data->chain_pos) + if (chain_pos != rob_bone_data->chain_pos_max) printf_debug_error("ChainPos mismatch"); rob_bone_data->field_1 = true; } static void rob_chara_bone_data_set_parent_mats(rob_chara_bone_data* rob_bone_data, - const uint16_t* parent_indices) { - if (rob_bone_data->nodes.size() < 1) + const uint16_t* node_parent_table) { + if (rob_bone_data->node_vec.size() < 1) return; - parent_indices++; - RobNode* i_begin = rob_bone_data->nodes.data(); - RobNode* i_begin_1 = rob_bone_data->nodes.data() + 1; - RobNode* i_end = rob_bone_data->nodes.data() + rob_bone_data->nodes.size(); + size_t node = 1; + RobNode* i_begin = rob_bone_data->node_vec.data(); + RobNode* i_begin_1 = rob_bone_data->node_vec.data() + 1; + RobNode* i_end = rob_bone_data->node_vec.data() + rob_bone_data->node_vec.size(); for (RobNode* i = i_begin_1; i != i_end; i++) - i->parent = &i_begin[*parent_indices++]; + i->parent = &i_begin[node_parent_table[node++]]; } -static void rob_chara_bone_data_set_rot_y(rob_chara_bone_data* rob_bone_data, float_t rot_y) { - rob_bone_data->motion_loaded.front()->bone_data.rot_y = rot_y; +static void rob_chara_bone_data_set_yrot(rob_chara_bone_data* rob_bone_data, float_t value) { + rob_bone_data->motion_loaded.front()->bone_data.yrot = value; } -static void rob_chara_bone_data_set_step(rob_chara_bone_data* rob_bone_data, float_t step) { +static void rob_chara_bone_data_set_step(rob_chara_bone_data* rob_bone_data, float_t value) { for (motion_blend_mot*& i : rob_bone_data->motion_loaded) - i->set_step(step); + i->set_step(value); } -static void sub_140413EB0(struc_308* a1) { - a1->field_8C = false; - a1->field_4C = a1->mat; - a1->mat = mat4_identity; +static void sub_140413EB0(MotionSmooth* a1) { + a1->base_mtx_set = false; + a1->base_mtx_bef = a1->base_mtx; + a1->base_mtx = mat4_identity; } static void sub_1404117F0(motion_blend_mot* a1) { - sub_140413EB0(&a1->field_4F8); - int32_t skeleton_select = a1->mot_key_data.skeleton_select; - for (RobBlock& i : a1->bone_data.bones) - i.get_mat(skeleton_select); + sub_140413EB0(&a1->smooth); + int32_t motion_body_type = a1->mot_key_data.motion_body_type; + for (RobBlock& i : a1->bone_data.block_vec) + i.get_mat(motion_body_type); } static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { - RobBlock* b_n_hara_cp = &a1->bone_data.bones.data()[BLK_N_HARA_CP]; - RobBlock* b_kg_hara_y = &a1->bone_data.bones.data()[BLK_KG_HARA_Y]; - RobBlock* b_kl_hara_xz = &a1->bone_data.bones.data()[BLK_KL_HARA_XZ]; - RobBlock* b_kl_hara_etc = &a1->bone_data.bones.data()[BLK_KL_HARA_ETC]; - a1->field_4F8.field_90 = 0.0f; + RobBlock* b_n_hara_cp = &a1->bone_data.block_vec[BLK_N_HARA_CP]; + RobBlock* b_kg_hara_y = &a1->bone_data.block_vec[BLK_KG_HARA_Y]; + RobBlock* b_kl_hara_xz = &a1->bone_data.block_vec[BLK_KL_HARA_XZ]; + RobBlock* b_kl_hara_etc = &a1->bone_data.block_vec[BLK_KL_HARA_ETC]; + a1->smooth.field_90 = 0.0f; mat4 chain_rot = b_n_hara_cp->chain_rot[0]; mat4 mat = b_kg_hara_y->chain_rot[0]; @@ -10535,27 +11043,27 @@ static void sub_14040FBF0(motion_blend_mot* a1, float_t a2) { b_kl_hara_xz->chain_rot[0] = mat4_identity; b_kl_hara_etc->chain_rot[0] = mat4_identity; - float_t v8 = a1->field_4F8.field_C0; - float_t v9 = a1->field_4F8.field_C4; - vec3 v10 = a1->field_4F8.field_C8; - a1->field_4F8.field_A8 = b_n_hara_cp->leaf_pos[0]; - if (!a1->mot_key_data.skeleton_select) { + float_t v8 = a1->smooth.field_C0; + float_t v9 = a1->smooth.field_C4; + vec3 v10 = a1->smooth.field_C8; + a1->smooth.field_A8 = b_n_hara_cp->leaf_pos[1]; + if (!a1->mot_key_data.motion_body_type) { if (a2 != v9) { - b_n_hara_cp->leaf_pos[0].x = (b_n_hara_cp->leaf_pos[0].x - v10.x) * v9 + v10.x; - b_n_hara_cp->leaf_pos[0].z = (b_n_hara_cp->leaf_pos[0].z - v10.z) * v9 + v10.z; + b_n_hara_cp->leaf_pos[1].x = (b_n_hara_cp->leaf_pos[1].x - v10.x) * v9 + v10.x; + b_n_hara_cp->leaf_pos[1].z = (b_n_hara_cp->leaf_pos[1].z - v10.z) * v9 + v10.z; } - b_n_hara_cp->leaf_pos[0].y = ((b_n_hara_cp->leaf_pos[0].y - v10.y) * v8) + v10.y; + b_n_hara_cp->leaf_pos[1].y = ((b_n_hara_cp->leaf_pos[1].y - v10.y) * v8) + v10.y; } else { if (a2 != v9) { v9 /= a2; - b_n_hara_cp->leaf_pos[0].x = (b_n_hara_cp->leaf_pos[0].x - v10.x) * v9 + v10.x; - b_n_hara_cp->leaf_pos[0].z = (b_n_hara_cp->leaf_pos[0].z - v10.z) * v9 + v10.z; + b_n_hara_cp->leaf_pos[1].x = (b_n_hara_cp->leaf_pos[1].x - v10.x) * v9 + v10.x; + b_n_hara_cp->leaf_pos[1].z = (b_n_hara_cp->leaf_pos[1].z - v10.z) * v9 + v10.z; } if (a2 != v8) { v8 /= a2; - b_n_hara_cp->leaf_pos[0].y = (b_n_hara_cp->leaf_pos[0].y - v10.y) * v8 + v10.y; + b_n_hara_cp->leaf_pos[1].y = (b_n_hara_cp->leaf_pos[1].y - v10.y) * v8 + v10.y; } } } @@ -10583,16 +11091,16 @@ static void sub_140410B70(motion_blend_mot* a1, prj::sys_vector* a2) { if (!v3 || !v3->enable) return; - v3->Field_20(&a1->bone_data.bones, a2); + v3->Field_20(&a1->bone_data.block_vec, a2); - for (RobBlock& i : a1->bone_data.bones) { + for (RobBlock& i : a1->bone_data.block_vec) { if (!a1->enabled_bones.arr[i.block_id]) continue; RobBlock* v6 = 0; if (a2) v6 = &a2->data()[i.block_id]; - v3->Blend(&a1->bone_data.bones.data()[i.block_id], v6); + v3->Blend(&a1->bone_data.block_vec[i.block_id], v6); } } @@ -10619,7 +11127,7 @@ static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { auto v4 = i; v4++; - sub_140410A40(*i, &(*v4)->bone_data.bones, &(*i)->bone_data.bones); + sub_140410A40(*i, &(*v4)->bone_data.block_vec, &(*i)->bone_data.block_vec); } auto j_begin = rob_bone_data->motion_loaded.rbegin(); @@ -10632,7 +11140,7 @@ static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { if (j != rob_bone_data->motion_loaded.rbegin()) { auto v5 = j; v5--; - bones = &(*v5)->bone_data.bones; + bones = &(*v5)->bone_data.block_vec; } else if ((*j)->get_type() != MOTION_BLEND_FREEZE) continue; @@ -10640,18 +11148,18 @@ static void sub_1404182B0(rob_chara_bone_data* rob_bone_data) { sub_140410B70(*j, bones); } - sub_140410CB0(&rob_bone_data->face, &v3->bone_data.bones); - sub_140410CB0(&rob_bone_data->hand_l, &v3->bone_data.bones); - sub_140410CB0(&rob_bone_data->hand_r, &v3->bone_data.bones); - sub_140410CB0(&rob_bone_data->mouth, &v3->bone_data.bones); - sub_140410CB0(&rob_bone_data->eyes, &v3->bone_data.bones); - sub_140410CB0(&rob_bone_data->eyelid, &v3->bone_data.bones); + sub_140410CB0(&rob_bone_data->face, &v3->bone_data.block_vec); + sub_140410CB0(&rob_bone_data->hand_l, &v3->bone_data.block_vec); + sub_140410CB0(&rob_bone_data->hand_r, &v3->bone_data.block_vec); + sub_140410CB0(&rob_bone_data->mouth, &v3->bone_data.block_vec); + sub_140410CB0(&rob_bone_data->eyes, &v3->bone_data.block_vec); + sub_140410CB0(&rob_bone_data->eyelid, &v3->bone_data.block_vec); - RobBlock* v7 = &v3->bone_data.bones.data()[0]; - v3->field_4F8.field_9C = v7->leaf_pos[0]; - if (sub_140413790(&v3->field_4F8)) { // WTF??? - v3->field_4F8.field_90 = v7->leaf_pos[0]; - v7->leaf_pos[0] -= v7->leaf_pos[0]; + RobBlock* v7 = &v3->bone_data.block_vec[0]; + v3->smooth.field_9C = v7->leaf_pos[1]; + if (sub_140413790(&v3->smooth)) { // WTF??? + v3->smooth.field_90 = v7->leaf_pos[1]; + v7->leaf_pos[1] -= v7->leaf_pos[1]; } } @@ -10663,261 +11171,8 @@ void sub_14041B9F0(rob_chara_bone_data* rob_bone_data) { rob_bone_data->eyelid.enabled_bones.check(); } -void sub_140506C20(struc_523* a1) { - a1->field_0 = 0; - a1->field_1 = 0; - a1->field_4 = 0; - a1->field_8 = 0; - a1->field_C = 0; - a1->field_10 = 0.0f; - a1->field_1C = 0; - a1->field_20 = 0; - a1->field_24 = 0; - a1->field_28 = 0; - a1->field_2C = 0; - a1->field_30 = 0; - a1->field_34 = 0; - a1->field_38 = 0; - a1->field_3C = 0; - a1->field_40 = 0; - a1->field_44 = 0; - a1->field_48 = 0; - a1->field_4C = 0; - a1->field_50 = 0; - a1->field_58.clear(); - a1->field_68 = 0; - a1->field_70 = 0; - a1->field_78 = 0; - a1->field_7C = 0; - a1->field_80 = 0.0f; -} - -static void sub_140505C90(struc_264* a1) { - a1->field_0 = 0; - a1->field_4 = { 0, {}, (uint32_t)-1, 0 }; - a1->field_18 = { 0, {}, (uint32_t)-1, 0 }; - a1->field_2C = { 0, {}, (uint32_t)-1, 0 }; - a1->field_40 = { 0, {}, (uint32_t)-1, 0 }; - a1->field_54 = { 0, {}, (uint32_t)-1, 0 }; - a1->field_68 = 0; - a1->field_6C = 0; - a1->field_70 = 0; - a1->field_74 = 0.0f; - a1->field_78 = 0x7FFF; - a1->field_7C = 0; - a1->field_80 = 0; - a1->field_84 = 0; - a1->field_8C = 0; - a1->field_94 = 0; - a1->field_98 = 0; - a1->field_9C = 0; - a1->field_A0 = 0; - a1->field_A4 = 0; - a1->field_A5 = 0; - a1->field_A8 = 0; - a1->field_AC = 0; - a1->field_B0 = 0; - a1->field_B4 = 0; - sub_140506C20(&a1->field_B8); - a1->field_140 = 0; - a1->field_144 = 0; - a1->field_146 = 0; - a1->field_148 = 0; - a1->field_150 = 0; - a1->field_152 = 0; - a1->field_154 = 0; - a1->field_158 = 0; - a1->field_15C = 0; - a1->field_160 = 0; - a1->field_168 = -1; - a1->field_16C = 0; - a1->field_170 = 0; - a1->field_174 = 0; - a1->field_178 = 0; - a1->field_17C = 0; - a1->field_180 = 0; - a1->field_184 = 0; - a1->field_188 = 0; - a1->field_18C = 999.0f; - a1->field_190 = 0; - a1->field_194 = 0; - a1->field_198 = 0; - a1->field_19C = 0; - a1->field_1A0 = 0; - a1->kamae_type = 0; - a1->kamae_data = 0; - a1->field_1B0 = 0; - a1->field_1B4 = 0; - a1->field_1B8 = 0; - a1->field_1BC = -1; - a1->field_1C0.field_0 = 0; - a1->field_1C0.field_4 = 0; - a1->field_1C8 = 0; - a1->field_1C9 = 0; - a1->field_1CA = 0; - a1->field_1CC = 0; - a1->field_1D0 = 0; - a1->field_1D4 = 0; -} - -static void sub_140505FB0(struc_209* a1) { - a1->field_0 = 0; - a1->field_4 = 0; - a1->field_8 = 0; - a1->field_C = 0; - a1->field_10 = 0; - a1->field_14 = 0; - a1->field_18 = 0; - a1->field_1C = 0; - a1->field_20 = 0; - a1->field_24 = 0; - a1->field_28 = 0; - a1->field_2C = 0; - a1->field_30 = 0; - a1->field_34 = 0; - a1->field_38 = 0; - a1->field_3C = 0; - a1->field_40 = 0; - a1->field_44 = 0; - a1->field_48 = 0; - a1->field_4C = 0; - a1->field_50 = 0; - a1->field_54 = 0; - a1->field_58 = 0; - a1->field_5C = -1; - a1->field_60 = 0; - a1->field_64 = 0; - a1->field_68 = -1; - a1->field_6C = 0; - a1->field_70 = 0; - a1->field_74 = 0; - - for (mat4& i : a1->field_78) - i = mat4_identity; - - for (mat4& i : a1->field_738) - i = mat4_identity; - - for (struc_195& i : a1->field_DF8) - i = {}; - - for (struc_195& i : a1->field_1230) - i = {}; - - for (struc_195& i : a1->field_1668) - i = {}; - - for (pos_scale& i : a1->field_1AA0) - i = {}; - - for (float_t& i : a1->field_1BE4) - i = 0.0f; - - a1->field_1C50.clear(); - a1->field_1C50.resize(27); - - size_t v3 = 0; - for (std::pair& i : a1->field_1C50) - i = { v3++, 0.0f }; - - a1->field_1C68 = 27; - a1->field_1C70 = 27; - a1->field_1C78 = 27; - a1->field_1C80 = 27; - - for (int32_t& i : a1->field_1C88) - i = 0; - - for (int32_t& i : a1->field_1CF4) - i = 0; - - for (int32_t& i : a1->field_1D60) - i = 0; - - a1->field_1DCC = 0; - a1->field_1DD0 = 0; - a1->field_1DD4 = 0; - a1->field_1DD8 = 0; - a1->field_1DDC = 0; - a1->field_1DE0 = 0; - a1->field_1DE4 = 0.0f; - a1->field_1DE8 = -1; - a1->field_1DEC = -1; - a1->field_1DF0 = 0; - a1->field_1DF4 = 0; - a1->field_1DF8 = -1; - a1->field_1DFC = -1; - - a1->field_1E00 = 0; - a1->field_1E04 = 0; - a1->field_1E08 = 0; - a1->field_1E0C = 0; - a1->field_1E10 = 0; - a1->field_1E14 = 0; - a1->field_1E18 = 0; - a1->field_1E1C = 0; - a1->field_1E20 = 0; - a1->field_1E24 = 0; - a1->field_1E28 = 0; - a1->field_1E2C = 0; - a1->field_1E30 = 0; - a1->field_1E34 = 0; - a1->field_1E38 = 0; - a1->field_1E3C = 0; - a1->field_1E40 = 0; - a1->field_1E44 = 0; - a1->field_1E48 = 0; - a1->field_1E4C = 0; - a1->field_1E50 = 0; - a1->field_1E54 = 0; - a1->field_1E58 = 0; - a1->field_1E5C = 0; - a1->field_1E60 = 0; - a1->field_1E64 = 0; - a1->field_1E68 = 0; - a1->field_1E6C = 0; - a1->field_1E70 = 0; - a1->field_1E74 = 0; - a1->field_1E78 = 0; - a1->field_1E7C = 0; - a1->field_1E80 = 0; - a1->field_1E84 = 0; - a1->field_1E88 = 0; - a1->field_1E8C = 0; - a1->field_1E90 = 0; - a1->field_1E94 = 0; - a1->field_1E98 = 0; - a1->field_1E9C = 0; - a1->field_1EA0 = 0; - a1->field_1EA4 = 0; - a1->field_1EA8 = 0; - a1->field_1EAC = 0; - a1->field_1EB0 = 0; - - for (struc_267& i : a1->field_1EB4) - i = { 1000.0f, 0x145F, 0, -1.0f, 0 }; - - for (int32_t& i : a1->field_1EF4) - i = 0; - - a1->field_1F04 = 1; - a1->field_1F08 = 0; - a1->field_1F0C = 0; - a1->field_1F10 = 0; - a1->field_1F14 = 0; - a1->field_1F18 = 0; - a1->field_1F1C = 0; - a1->field_1F20 = 0; - a1->field_1F21 = 0; - a1->field_1F22 = 0; - a1->field_1F23 = 0; - a1->field_1F24 = 0; - a1->field_1F25 = 0; - a1->field_1F26 = 0; -} - -static float_t sub_140512F60(rob_chara_item_equip* rob_disp) { - const mat4* motion_matrix = rob_disp->motion_matrix; +static float_t sub_140512F60(RobDisp* disp) { + const mat4* motion_matrix = disp->motion_matrix; float_t y = 1.0f; y = min_def(y, motion_matrix[BONE_ID_N_HARA_CP ].row3.y); y = min_def(y, motion_matrix[BONE_ID_KL_ASI_L_WJ_CO].row3.y); @@ -10928,53 +11183,53 @@ static float_t sub_140512F60(rob_chara_item_equip* rob_disp) { } static void rob_chara_add_motion_reset_data(rob_chara* rob_chr, - uint32_t motion_id, float_t frame, int32_t iterations) { - if (motion_id != -1) - rob_chr->rob_disp->add_motion_reset_data(motion_id, frame, iterations); + const uint32_t& motnum, const float_t& frame, int32_t init_cnt) { + if (motnum != -1) + rob_chr->disp->add_motion_reset_data(motnum, frame, init_cnt); } -static void rob_chara_age_age_ctrl(rob_chara* rob_chr, int32_t part_id, const char* name) { - mat4 mat = *rob_chr->rob_disp->get_ex_data_bone_node_mat(RPK_KAMI, name); - if (vec3::length(rob_chr->data.adjust_data.pos_adjust) > 0.000001f) { +static void rob_chara_age_age_ctrl(rob_chara* rob_chr, int32_t part, const char* name) { + mat4 mat = *rob_chr->disp->get_ex_data_bone_node_mat(RPK_KAMI, name); + if (vec3::length(rob_chr->rob_base.adjust.pos_adjust) > 0.000001f) { mat4 temp; - mat4_translate(&rob_chr->data.adjust_data.pos_adjust, &temp); + mat4_translate(&rob_chr->rob_base.adjust.pos_adjust, &temp); mat4_mul(&mat, &temp, &mat); } - rob_chara_age_age_array_ctrl(rob_chr->chara_id, part_id, mat); + rob_chara_age_age_array_ctrl(rob_chr->idnm, part, mat); } static object_info rob_chara_get_head_object(rob_chara* rob_chr, int32_t head_object_id) { if (head_object_id < 0 || head_object_id > 8) return {}; - object_info obj_info = rob_chr->item_cos_data.get_head_object_replace(head_object_id); + object_info obj_info = rob_chr->item.get_head_object_replace(head_object_id); if (obj_info.not_null()) return obj_info; return rob_chr->rob_data->head_objects[head_object_id]; } static object_info rob_chara_get_object_info(rob_chara* rob_chr, ROB_PARTS_KIND rpk) { - return rob_chr->rob_disp->get_object_info(rpk); + return rob_chr->disp->get_objid(rpk); } static void rob_chara_load_default_motion(rob_chara* rob_chr, const bone_database* bone_data, const motion_database* mot_db) { - uint32_t motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); - rob_chara_load_default_motion_sub(rob_chr, 1, motion_id, bone_data, mot_db); + uint32_t motnum = rob_chr->get_common_mot(MTP_NONE); + rob_chara_load_default_motion_sub(rob_chr, 1, motnum, bone_data, mot_db); } -static void sub_140419820(rob_chara_bone_data* rob_bone_data, int32_t skeleton_select) { - rob_bone_data->motion_loaded.front()->store_curr_rot_trans(skeleton_select); +static void sub_140419820(rob_chara_bone_data* rob_bone_data, int32_t target) { + rob_bone_data->motion_loaded.front()->get_smooth_target(target); } -static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skeleton_select, - uint32_t motion_id, const bone_database* bone_data, const motion_database* mot_db) { +static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t motion_body_type, + uint32_t motnum, const bone_database* bone_data, const motion_database* mot_db) { rob_chr->bone_data->load_face_motion(-1, mot_db); rob_chr->bone_data->load_hand_l_motion(-1, mot_db); rob_chr->bone_data->load_hand_r_motion(-1, mot_db); rob_chr->bone_data->load_mouth_motion(-1, mot_db); rob_chr->bone_data->load_eyes_motion(-1, mot_db); rob_chr->bone_data->load_eyelid_motion(-1, mot_db); - rob_chara_bone_data_motion_load(rob_chr->bone_data, motion_id, MOTION_BLEND_FREEZE, bone_data, mot_db); + rob_chara_bone_data_motion_load(rob_chr->bone_data, motnum, MOTION_BLEND_FREEZE, bone_data, mot_db); rob_chr->bone_data->set_frame(0.0f); sub_14041C680(rob_chr->bone_data, false); sub_14041C9D0(rob_chr->bone_data, false); @@ -10982,17 +11237,17 @@ static void rob_chara_load_default_motion_sub(rob_chara* rob_chr, int32_t skelet sub_14041BC40(rob_chr->bone_data, false); sub_14041D270(rob_chr->bone_data, 0.0f); sub_14041D2A0(rob_chr->bone_data, 0.0f); - rob_chara_bone_data_set_rot_y(rob_chr->bone_data, 0.0f); + rob_chara_bone_data_set_yrot(rob_chr->bone_data, 0.0f); rob_chr->bone_data->set_motion_blend_duration(0.0f, 1.0f, 1.0f); sub_14041D310(rob_chr->bone_data, 0.0f, 0.0f, 2); rob_chr->bone_data->interpolate(); rob_chr->bone_data->update(0); rob_chr->sub_140509D30(); - sub_140419820(rob_chr->bone_data, skeleton_select); + sub_140419820(rob_chr->bone_data, motion_body_type); } static bool rob_chara_data_adjust_compare(rob_chara_data_adjust* left, rob_chara_data_adjust* right) { - return right->motion_id == left->motion_id + return right->motnum == left->motnum && left->set_frame == 0.0f && right->type == left->type && right->cycle_type == left->cycle_type @@ -11020,21 +11275,6 @@ static void rob_chara_set_adjust(rob_chara* rob_chr, rob_chara_data_adjust* adju *adjust = *adjust_new; } -static void rob_chara_set_pv_data(rob_chara* rob_chr, int8_t chara_id, - CHARA_NUM chara_num, int32_t cos_id, const rob_chara_pv_data& pv_data) { - rob_chr->chara_id = chara_id; - rob_chr->chara_num = chara_num; - rob_chr->cos_id = cos_id; - rob_chr->pv_data = pv_data; - rob_chr->rob_data = get_rob_data(chara_num); - if (!check_cos_id_is_501(cos_id)) { - const item_cos_data* cos = item_table_handler_array_get_item_cos_data(chara_num, cos_id); - if (cos) - rob_chr->item_cos_data.set_chara_num_item_nos(chara_num, cos->arr); - } - rob_chr->item_cos_data.set_item_array(pv_data.item); -} - static void rob_cmn_mottbl_read(void* a1, const void* data, size_t size) { free_def(common_mot_tbl_header); @@ -11049,274 +11289,539 @@ static void rob_cmn_mottbl_read(void* a1, const void* data, size_t size) { } } -static void opd_chara_data_array_add_frame_data(int32_t chara_id) { - opd_chara_data_array_get(chara_id)->add_frame_data(); +static void opd_chara_data_array_add_frame_data(ROB_ID rob_id) { + opd_chara_data_array_get(rob_id)->add_frame_data(); } -static void opd_chara_data_array_encode_data(int32_t chara_id) { - opd_chara_data_array_get(chara_id)->encode_data(); +static void opd_chara_data_array_encode_data(ROB_ID rob_id) { + opd_chara_data_array_get(rob_id)->encode_data(); } -static void opd_chara_data_array_encode_init_data(int32_t chara_id, uint32_t motion_id) { - opd_chara_data_array_get(chara_id)->encode_init_data(motion_id); +static void opd_chara_data_array_encode_init_data(ROB_ID rob_id, uint32_t motnum) { + opd_chara_data_array_get(rob_id)->encode_init_data(motnum); } -static void opd_chara_data_array_fs_copy_file(int32_t chara_id) { - opd_chara_data_array_get(chara_id)->fs_copy_file(); +static void opd_chara_data_array_fs_copy_file(ROB_ID rob_id) { + opd_chara_data_array_get(rob_id)->fs_copy_file(); } -static opd_chara_data* opd_chara_data_array_get(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) - chara_id = 0; - return &opd_chara_data_array[chara_id]; +static opd_chara_data* opd_chara_data_array_get(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) + rob_id = ROB_ID_1P; + return &opd_chara_data_array[rob_id]; } -static void opd_chara_data_array_init_data(int32_t chara_id, uint32_t motion_id) { - opd_chara_data_array_get(chara_id)->init_data(motion_id); +static void opd_chara_data_array_init_data(ROB_ID rob_id, uint32_t motnum) { + opd_chara_data_array_get(rob_id)->init_data(motnum); } -static void opd_chara_data_array_open_opd_file(int32_t chara_id) { - opd_chara_data_array_get(chara_id)->open_opd_file(); +static void opd_chara_data_array_open_opd_file(ROB_ID rob_id) { + opd_chara_data_array_get(rob_id)->open_opd_file(); } -static void opd_chara_data_array_open_opdi_file(int32_t chara_id) { - opd_chara_data_array_get(chara_id)->open_opdi_file(); +static void opd_chara_data_array_open_opdi_file(ROB_ID rob_id) { + opd_chara_data_array_get(rob_id)->open_opdi_file(); } -static void opd_chara_data_array_write_file(int32_t chara_id) { - opd_chara_data_array_get(chara_id)->write_file(); +static void opd_chara_data_array_write_file(ROB_ID rob_id) { + opd_chara_data_array_get(rob_id)->write_file(); } -static rob_manager_rob_impl* rob_manager_rob_impls1_get(TaskRobManager* rob_mgr) { - if (!rob_manager_rob_impls1_init) { - rob_manager_rob_impls1_init = true; - rob_manager_rob_impls1[0].task = &rob_mgr->rob_prepare_control; - rob_manager_rob_impls1[0].name = "ROB_PREPARE_CONTROL"; - rob_manager_rob_impls1[1].task = 0; - rob_manager_rob_impls1[1].name = ""; - } - return rob_manager_rob_impls1; +static const RobTaskList* get_rob_manager_list_before(TaskRobManager* task_rob_mgr) { + static RobTaskList list_before[] = { + RobTaskList(&task_rob_mgr->task_rob_prepare_ctrl, "ROB_PREPARE_CONTROL"), + RobTaskList(), + }; + + return list_before; } -static rob_manager_rob_impl* rob_manager_rob_impls2_get(TaskRobManager* rob_mgr) { - if (!rob_manager_rob_impls2_init) { - rob_manager_rob_impls2_init = true; - rob_manager_rob_impls2[0].task = &rob_mgr->rob_prepare_action; - rob_manager_rob_impls2[0].name = "ROB_PREPARE_ACTION"; - rob_manager_rob_impls2[1].task = &rob_mgr->rob_base; - rob_manager_rob_impls2[1].name = "ROB_BASE"; - rob_manager_rob_impls2[2].task = &rob_mgr->rob_motion_modifier; - rob_manager_rob_impls2[2].name = "ROB_MOTION_MODIFIER"; - rob_manager_rob_impls2[3].task = &rob_mgr->rob_collision; - rob_manager_rob_impls2[3].name = "ROB_COLLISION"; - rob_manager_rob_impls2[4].task = &rob_mgr->rob_info; - rob_manager_rob_impls2[4].name = "ROB_INFO"; - rob_manager_rob_impls2[5].task = &rob_mgr->rob_disp; - rob_manager_rob_impls2[5].name = "ROB_DISP"; - rob_manager_rob_impls2[6].task = 0; - rob_manager_rob_impls2[6].name = ""; - } - return rob_manager_rob_impls2; +static const RobTaskList* get_rob_manager_list_after(TaskRobManager* task_rob_mgr) { + static RobTaskList list_after[] = { + RobTaskList(&task_rob_mgr->task_rob_prepare_act , "ROB_PREPARE_ACTION" ), + RobTaskList(&task_rob_mgr->task_rob_base , "ROB_BASE" ), + RobTaskList(&task_rob_mgr->task_rob_motion_modifier, "ROB_MOTION_MODIFIER"), + RobTaskList(&task_rob_mgr->task_rob_collision , "ROB_COLLISION" ), + RobTaskList(&task_rob_mgr->task_rob_info , "ROB_INFO" ), + RobTaskList(&task_rob_mgr->task_rob_disp , "ROB_DISP" ), + RobTaskList(), + }; + + return list_after; } -void rob_chara_age_age_array_ctrl(int32_t chara_id, int32_t part_id, mat4& mat) { - rob_chara_age_age_ctrl(rob_chara_age_age_array, chara_id, part_id, mat); +RobManagement* get_rob_management() { + return &s_rob_management; } -void rob_chara_age_age_array_disp(render_context* rctx, - int32_t chara_id, bool reflect, bool chara_color) { - mdl::ObjFlags obj_flags = rctx->disp_manager->get_obj_flags(); - rob_chara_age_age_disp(rob_chara_age_age_array, rctx, chara_id, reflect, chara_color); - rctx->disp_manager->set_obj_flags(obj_flags); -} - -void rob_chara_age_age_array_load(int32_t chara_id, int32_t part_id) { - rob_chara_age_age_load(rob_chara_age_age_array, chara_id, part_id); -} - -void rob_chara_age_age_array_reset(int32_t chara_id) { - rob_chara_age_age_reset(rob_chara_age_age_array, chara_id); -} - -void rob_chara_age_age_array_set_alpha(int32_t chara_id, int32_t part_id, float_t alpha) { - rob_chara_age_age_set_alpha(rob_chara_age_age_array, chara_id, part_id, alpha); -} - -void rob_chara_age_age_array_set_disp(int32_t chara_id, int32_t part_id, bool value) { - rob_chara_age_age_set_disp(rob_chara_age_age_array, chara_id, part_id, value); -} - -void rob_chara_age_age_array_set_move_cancel(int32_t chara_id, int32_t part_id, float_t value) { - rob_chara_age_age_set_move_cancel(rob_chara_age_age_array, chara_id, part_id, value); -} - -void rob_chara_age_age_array_set_npr(int32_t chara_id, int32_t part_id, bool value) { - rob_chara_age_age_set_npr(rob_chara_age_age_array, chara_id, part_id, value); -} - -void rob_chara_age_age_array_set_params(int32_t chara_id, int32_t part_id, - int32_t npr, int32_t speed, int32_t skip, int32_t disp) { - if (!npr || npr == 1) - rob_chara_age_age_array_set_npr(chara_id, part_id, npr); - if (speed != -1) - rob_chara_age_age_array_set_speed(chara_id, part_id, (float_t)speed * 0.001f); - if (skip != -1) - rob_chara_age_age_array_set_skip(chara_id, part_id); - if (!disp || disp == 1) - rob_chara_age_age_array_set_disp(chara_id, part_id, !!disp); -} - -void rob_chara_age_age_array_set_speed(int32_t chara_id, int32_t part_id, float_t value) { - rob_chara_age_age_set_speed(rob_chara_age_age_array, chara_id, part_id, value); -} - -void rob_chara_age_age_array_set_skip(int32_t chara_id, int32_t part_id) { - rob_chara_age_age_set_skip(rob_chara_age_age_array, chara_id, part_id); -} - -void rob_chara_age_age_array_set_step(int32_t chara_id, int32_t part_id, float_t step) { - rob_chara_age_age_set_step(rob_chara_age_age_array, chara_id, part_id, step); -} - -void rob_chara_age_age_array_set_step_full(int32_t chara_id, int32_t part_id) { - rob_chara_age_age_set_step_full(rob_chara_age_age_array, chara_id, part_id); -} - -bool rob_chara_array_check_visibility(int32_t chara_id) { - if (rob_chara_pv_data_array_check_chara_id(chara_id)) - return rob_chara_array[chara_id].is_visible(); - return false; -} - -rob_chara* rob_chara_array_get(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) - return 0; - - if (rob_chara_pv_data_array_check_chara_id(chara_id)) - return &rob_chara_array[chara_id]; +const RobData* get_rob_data(CHARA_NUM cn) { + if (cn >= 0 && cn < CN_MAX) + return &rob_data[cn]; return 0; } -rob_chara_bone_data* rob_chara_array_get_bone_data(int32_t chara_id) { - return rob_chara_array[chara_id].bone_data; +int32_t rob_data_get_chara_size_index(CHARA_NUM cn) { + const RobData* rob_data = get_rob_data(cn); + if (rob_data) + return rob_data->field_848.chara_size_index; + return 1; } -float_t rob_chara_array_get_data_adjust_scale(int32_t chara_id) { - if (rob_chara_pv_data_array_check_chara_id(chara_id)) - return rob_chara_array[chara_id].data.adjust_data.scale; +int32_t rob_data_get_swim_costume(CHARA_NUM cn) { + const RobData* RobData = get_rob_data(cn); + if (rob_data) + return rob_data->field_848.swim_costume; + return 0; +} + +int32_t rob_data_get_swim_s_costume(CHARA_NUM cn) { + const RobData* RobData = get_rob_data(cn); + if (rob_data) + return rob_data->field_848.swim_s_costume; + return 0; +} + +float_t chara_size_table_get_value(uint32_t index) { + static const float_t chara_size_table[] = { + 1.07f, 1.0f, 0.96f, 0.987f, 1.025f, 1.045f + }; + + if (index >= 0 && index < 5) + return chara_size_table[index]; return 1.0f; } -rob_chara_item_cos_data* rob_chara_array_get_item_cos_data(int32_t chara_id) { - return &rob_chara_array[chara_id].item_cos_data; +float_t chara_pos_adjust_y_table_get_value(uint32_t index) { + static const float_t chara_pos_adjust_y_table[] = { + 0.071732f, 0.0f, -0.03859f, 0.0f, 0.0f + }; + + if (index >= 0 && index < 5) + return chara_pos_adjust_y_table[index]; + return 0.0f; } -rob_chara_item_equip* rob_chara_array_get_rob_disp(int32_t chara_id) { - return rob_chara_array[chara_id].rob_disp; +bool check_cos_id_is_501(int32_t cos_id) { + if (cos_id == -1 || cos_id >= 502) + return false; + return cos_id == 501; } -int32_t rob_chara_array_init_chara_num(CHARA_NUM chara_num, - const rob_chara_pv_data& pv_data, int32_t cos_id, bool can_set_default) { - if (!app::TaskWork::check_task_ready(task_rob_manager) - || pv_data.type < ROB_CHARA_TYPE_0|| pv_data.type > ROB_CHARA_TYPE_3) - return -1; +const char* get_dev_ram_opdi_dir() { + return "dev_ram/opdi"; +} - int32_t chara_id = 0; - while (rob_chara_pv_data_array[chara_id].type != ROB_CHARA_TYPE_NONE) { - chara_id++; - if (chara_id >= ROB_ID_MAX) - return -1; +const float_t get_gravity() { + return 0.00299444468691945f; +} + +const uint32_t* get_opd_motion_ids() { + static const uint32_t opd_motion_ids[] = { + 195, (uint32_t)-1, // CMN_MRA00_13_01 + }; + + return opd_motion_ids; +} + +const uint32_t* get_opd_motion_set_ids() { + static const uint32_t opd_motion_set_ids[] = { + 51, 194, 797, (uint32_t)-1, // EDT, EDT2, EDTF1 + }; + + return opd_motion_set_ids; +} + +const char* get_ram_osage_play_data_dir() { + return "ram/osage_play_data"; +} + +const char* get_ram_osage_play_data_tmp_dir() { + return "ram/osage_play_data_tmp"; +} + +const char* get_rom_osage_play_data_dir() { + return "rom/osage_play_data"; +} + +const char* get_rom_osage_play_data_opdi_dir() { + return "rom/osage_play_data/opdi"; +} + +OpdChecker* opd_checker_get() { + return opd_checker; +} + +bool opd_checker_check_state_not_3() { + return opd_checker_get()->CheckStateNot3(); +} + +bool opd_checker_has_objects() { + return !!opd_checker_get()->GetObjects().size(); +} + +void opd_checker_launch_thread() { + opd_checker_get()->LaunchThread(); +} + +void opd_checker_terminate_thread() { + opd_checker_get()->TerminateThread(); +} + +void opd_make_manager_add_task(const OpdMakeManagerArgs& args) { + opd_make_manager->add_task(args); +} + +bool opd_make_manager_check_task_ready() { + return app::TaskWork::check_task_ready(opd_make_manager); +} + +bool opd_make_manager_del_task() { + return opd_make_manager->del_task(); +} + +OpdMakeManagerData* opd_make_manager_get_data() { + return opd_make_manager->GetData(); +} + +void opd_make_start() { + std::vector& objects = opd_checker_get()->GetObjects(); + std::vector motion_ids; + opd_make_start_get_motion_ids(motion_ids); + + OpdMakeManagerArgs args; + args.modules = 0; + args.use_current_skp = false; + args.use_opdi = true; + args.motion_ids = &motion_ids; + args.objects = &objects; + opd_make_manager->add_task(args); +} + +void opd_make_start_get_motion_ids(std::vector& motion_ids) { + data_struct* aft_data = &data_list[DATA_AFT]; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + const uint32_t* opd_motion_set_ids = get_opd_motion_set_ids(); + while (*opd_motion_set_ids != -1) { + const motion_set_info* set_info = aft_mot_db->get_motion_set_by_id(*opd_motion_set_ids); + if (!set_info) { + opd_motion_set_ids++; + continue; + } + + motion_ids.reserve(set_info->motion.size()); + for (const motion_info& i : set_info->motion) + motion_ids.push_back(i.id); + opd_motion_set_ids++; } - if (can_set_default && (cos_id < 0 || cos_id > 498)) - cos_id = 0; - rob_chara_pv_data_array[chara_id] = pv_data; - rob_chara_set_pv_data(&rob_chara_array[chara_id], chara_id, chara_num, cos_id, pv_data); - task_rob_manager->AppendInitCharaList(&rob_chara_array[chara_id]); - return chara_id; + /*const uint32_t* opd_motion_ids = get_opd_motion_ids(); + while (*opd_motion_ids != -1) { + motion_ids.push_back(*opd_motion_ids); + opd_motion_ids++; + }*/ + motion_ids.push_back(195); // CMN_MRA00_13_01 + prj::sort_unique(motion_ids); } -void rob_chara_array_free_chara_id(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) - return; - - task_rob_manager->AppendFreeCharaList(&rob_chara_array[chara_id]); - rob_chara_pv_data_array[chara_id].type = ROB_CHARA_TYPE_NONE; +void opd_make_stop() { + opd_checker_terminate_thread(); + opd_make_manager_del_task(); } -void rob_chara_array_reset_pv_data(int32_t chara_id) { - rob_chara_pv_data_array[chara_id].type = ROB_CHARA_TYPE_NONE; +bool osage_play_data_manager_add_task() { + return osage_play_data_manager->add(); } -void rob_chara_array_reset_bone_data_item_equip(int32_t chara_id) { - rob_chara_item_equip* rob_disp = rob_chara_array[chara_id].rob_disp; - rob_disp->reset_init_data(rob_chara_bone_data_get_node( - rob_chara_array[chara_id].bone_data, BONE_NODE_N_HARA_CP)); - rob_disp->set_shadow_group(chara_id); - rob_disp->shadow_flag = 0x05; +void osage_play_data_manager_append_chara_motion_id(rob_chara* rob_chr, uint32_t motnum) { + std::vector motion_ids; + motion_ids.push_back(motnum); + osage_play_data_manager->AppendCharaMotionId(rob_chr, motion_ids); } -void rob_chara_array_set_alpha_obj_flags(int32_t chara_id, float_t alpha, mdl::ObjFlags flags) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); +void osage_play_data_manager_append_chara_motion_ids( + rob_chara* rob_chr, const std::vector& motion_ids) { + osage_play_data_manager->AppendCharaMotionId(rob_chr, motion_ids); +} + +bool osage_play_data_manager_check_task_ready() { + return osage_play_data_manager->CheckTaskReady(); +} + +void osage_play_data_manager_get_opd_file_data(object_info obj_info, + uint32_t motnum, const float_t*& data, uint32_t& count) { + osage_play_data_manager->GetOpdFileData(obj_info, motnum, data, count); +} + +void osage_play_data_manager_reset() { + osage_play_data_manager->Reset(); +} + +void osage_play_database_load() { + data_struct* aft_data = &data_list[DATA_AFT]; + + for (const std::string& i : mdata_manager_get()->GetPrefixes()) { + std::string path(get_rom_osage_play_data_dir()); + path.append("/"); + path.append(i); + path.append("opd_db.txt"); + + if (aft_data->check_file_exists(path.c_str())) + osage_play_data_database->load(path.c_str()); + } +} + +void pv_osage_manager_array_reset(ROB_ID rob_id) { + pv_osage_manager_array_get(rob_id)->Reset(); +} + +void rob_init() { + if (!opd_chara_data_array) + opd_chara_data_array = new opd_chara_data[ROB_ID_MAX]; + + if (!opd_checker) + opd_checker = new OpdChecker; + + if (!opd_make_manager) + opd_make_manager = new OpdMakeManager; + + if (!opd_maker_array) + opd_maker_array = new OpdMaker[OPD_MAKE_COUNT]; + + if (!osage_play_data_database) + osage_play_data_database = new osage_play_data_database_struct; + + if (!osage_play_data_manager) + osage_play_data_manager = new OsagePlayDataManager; + + if (!pv_osage_manager_array) + pv_osage_manager_array = new PvOsageManager[ROB_ID_MAX]; + + if (!rob_chara_age_age_array) + rob_chara_age_age_array = new rob_chara_age_age[ROB_ID_MAX * 3]; + + { + p_file_handler rob_mot_tbl_file_handler; + rob_mot_tbl_file_handler.read_file(&data_list[DATA_AFT], "rom/rob/", "rob_mot_tbl.bin", prj::MemCSystem); + rob_mot_tbl_file_handler.set_callback_data(0, (PFNFILEHANDLERCALLBACK*)rob_cmn_mottbl_read, 0); + rob_mot_tbl_file_handler.read_now(); + rob_mot_tbl_file_handler.reset(); + } + + if (!rob_sleeve_handler_data) + rob_sleeve_handler_data = new rob_sleeve_handler; + + if (!rob_thread_handler) + rob_thread_handler = new RobThreadHandler; + + if (!task_rob_load) + task_rob_load = new TaskRobLoad; + + if (!task_rob_manager) + task_rob_manager = new TaskRobManager; +} + +void rob_free() { + if (task_rob_manager) { + delete task_rob_manager; + task_rob_manager = 0; + } + + if (task_rob_load) { + delete task_rob_load; + task_rob_load = 0; + } + + if (rob_thread_handler) { + delete rob_thread_handler; + rob_thread_handler = 0; + } + + if (rob_sleeve_handler_data) { + delete rob_sleeve_handler_data; + rob_sleeve_handler_data = 0; + } + + free_def(common_mot_tbl_header); + + if (rob_chara_age_age_array) { + delete[] rob_chara_age_age_array; + rob_chara_age_age_array = 0; + } + + if (pv_osage_manager_array) { + delete[] pv_osage_manager_array; + pv_osage_manager_array = 0; + } + + if (osage_play_data_manager) { + delete osage_play_data_manager; + osage_play_data_manager = 0; + } + + if (osage_play_data_database) { + delete osage_play_data_database; + osage_play_data_database = 0; + } + + if (opd_maker_array) { + delete[] opd_maker_array; + opd_maker_array = 0; + } + + if (opd_make_manager) { + delete opd_make_manager; + opd_make_manager = 0; + } + + if (opd_checker) { + delete opd_checker; + opd_checker = 0; + } + + if (opd_chara_data_array) { + delete[] opd_chara_data_array; + opd_chara_data_array = 0; + } +} + +void rob_chara_age_age_array_ctrl(int32_t rob_id, int32_t part, mat4& mat) { + rob_chara_age_age_ctrl(rob_chara_age_age_array, rob_id, part, mat); +} + +void rob_chara_age_age_array_disp(render_context* rctx, + int32_t rob_id, bool reflect, bool chara_color) { + mdl::ObjFlags obj_flags = rctx->disp_manager->get_obj_flags(); + rob_chara_age_age_disp(rob_chara_age_age_array, rctx, rob_id, reflect, chara_color); + rctx->disp_manager->set_obj_flags(obj_flags); +} + +void rob_chara_age_age_array_load(int32_t rob_id, int32_t part) { + rob_chara_age_age_load(rob_chara_age_age_array, rob_id, part); +} + +void rob_chara_age_age_array_reset(int32_t rob_id) { + rob_chara_age_age_reset(rob_chara_age_age_array, rob_id); +} + +void rob_chara_age_age_array_set_alpha(int32_t rob_id, int32_t part, float_t alpha) { + rob_chara_age_age_set_alpha(rob_chara_age_age_array, rob_id, part, alpha); +} + +void rob_chara_age_age_array_set_disp(int32_t rob_id, int32_t part, bool value) { + rob_chara_age_age_set_disp(rob_chara_age_age_array, rob_id, part, value); +} + +void rob_chara_age_age_array_set_move_cancel(int32_t rob_id, int32_t part, float_t value) { + rob_chara_age_age_set_move_cancel(rob_chara_age_age_array, rob_id, part, value); +} + +void rob_chara_age_age_array_set_npr(int32_t rob_id, int32_t part, bool value) { + rob_chara_age_age_set_npr(rob_chara_age_age_array, rob_id, part, value); +} + +void rob_chara_age_age_array_set_params(int32_t rob_id, int32_t part, + int32_t npr, int32_t speed, int32_t skip, int32_t disp) { + if (!npr || npr == 1) + rob_chara_age_age_array_set_npr(rob_id, part, npr); + if (speed != -1) + rob_chara_age_age_array_set_speed(rob_id, part, (float_t)speed * 0.001f); + if (skip != -1) + rob_chara_age_age_array_set_skip(rob_id, part); + if (!disp || disp == 1) + rob_chara_age_age_array_set_disp(rob_id, part, !!disp); +} + +void rob_chara_age_age_array_set_speed(int32_t rob_id, int32_t part, float_t value) { + rob_chara_age_age_set_speed(rob_chara_age_age_array, rob_id, part, value); +} + +void rob_chara_age_age_array_set_skip(int32_t rob_id, int32_t part) { + rob_chara_age_age_set_skip(rob_chara_age_age_array, rob_id, part); +} + +void rob_chara_age_age_array_set_step(int32_t rob_id, int32_t part, float_t step) { + rob_chara_age_age_set_step(rob_chara_age_age_array, rob_id, part, step); +} + +void rob_chara_age_age_array_set_step_full(int32_t rob_id, int32_t part) { + rob_chara_age_age_set_step_full(rob_chara_age_age_array, rob_id, part); +} + +rob_chara* rob_chara_array_get(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) + return 0; + + if (get_rob_management()->is_init(rob_id)) + return &RobManagement::rob_impl[rob_id]; + return 0; +} + +void rob_chara_array_reset_pv_data(ROB_ID rob_id) { + RobManagement::rob_init[rob_id].rob_type = ROB_TYPE_NULL; +} + +void rob_chara_array_reset_bone_data_item_equip(ROB_ID rob_id) { + RobDisp* disp = RobManagement::rob_impl[rob_id].disp; + disp->reset_init_data(rob_chara_bone_data_get_node( + RobManagement::rob_impl[rob_id].bone_data, BONE_NODE_N_HARA_CP)); + disp->set_shadow_group(rob_id); + disp->shadow_flag = 0x05; +} + +void rob_chara_array_set_alpha_obj_flags(ROB_ID rob_id, float_t alpha, mdl::ObjFlags flags) { + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chr->rob_disp->set_alpha_obj_flags(alpha, flags); + rob_chr->disp->set_alpha_obj_flags(alpha, flags); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_alpha(chara_id, 1, alpha); - rob_chara_age_age_array_set_alpha(chara_id, 2, alpha); + rob_chara_age_age_array_set_alpha(rob_id, 1, alpha); + rob_chara_age_age_array_set_alpha(rob_id, 2, alpha); } } -void rob_chara_array_set_visibility(int32_t chara_id, bool value) { - rob_chara_array[chara_id].set_visibility(value); -} - bool pv_osage_manager_array_get_disp() { bool disp = false; for (int32_t i = 0; i < ROB_ID_MAX; i++) - disp |= pv_osage_manager_array_get(i)->GetDisplay(); + disp |= pv_osage_manager_array_get((ROB_ID)i)->GetDisplay(); return disp; } -bool pv_osage_manager_array_get_disp(int32_t chara_id) { - return pv_osage_manager_array_get(chara_id)->GetDisplay(); +bool pv_osage_manager_array_get_disp(ROB_ID rob_id) { + return pv_osage_manager_array_get(rob_id)->GetDisplay(); } void pv_osage_manager_array_set_motion_ids( - int32_t chara_id, const std::vector& motion_ids) { + ROB_ID rob_id, const std::vector& motion_ids) { std::vector set_motion; for (const uint32_t& i : motion_ids) set_motion.push_back({ i }); - pv_osage_manager_array_get(chara_id)->SetPvSetMotion(set_motion); + pv_osage_manager_array_get(rob_id)->SetPvSetMotion(set_motion); } void pv_osage_manager_array_set_not_reset_true() { for (int32_t i = 0; i < ROB_ID_MAX; i++) - pv_osage_manager_array_get(i)->SetNotReset(true); + pv_osage_manager_array_get((ROB_ID)i)->SetNotReset(true); } -void pv_osage_manager_array_set_pv_id(int32_t chara_id, int32_t pv_id, bool reset) { - pv_osage_manager_array_get(chara_id)->SetPvId(pv_id, chara_id, reset); +void pv_osage_manager_array_set_pv_id(ROB_ID rob_id, int32_t pv_id, bool reset) { + pv_osage_manager_array_get(rob_id)->SetPvId(pv_id, rob_id, reset); } void pv_osage_manager_array_set_pv_set_motion( - int32_t chara_id, const std::vector& set_motion) { - pv_osage_manager_array_get(chara_id)->SetPvSetMotion(set_motion); + ROB_ID rob_id, const std::vector& set_motion) { + pv_osage_manager_array_get(rob_id)->SetPvSetMotion(set_motion); } -bool rob_chara_check_for_ageageagain_module(CHARA_NUM chara_num, int32_t cos_id) { - return chara_num == CN_MIKU && cos_id == 148; -} - -bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id) { - return rob_chara_pv_data_array[chara_id].type != ROB_CHARA_TYPE_NONE; +bool rob_chara_check_for_ageageagain_module(CHARA_NUM cn, int32_t cos_id) { + return cn == CN_MIKU && cos_id == 148; } void rob_sleeve_handler_data_get_sleeve_data( - CHARA_NUM chara_num, int32_t cos, rob_sleeve_data& l, rob_sleeve_data& r) { - rob_sleeve_handler_data->get_sleeve_data(chara_num, cos, l, r); + CHARA_NUM cn, int32_t cos, rob_sleeve_data& l, rob_sleeve_data& r) { + rob_sleeve_handler_data->get_sleeve_data(cn, cos, l, r); } bool rob_sleeve_handler_data_load() { @@ -11331,20 +11836,20 @@ bool task_rob_load_add_task() { return app::TaskWork::add_task(task_rob_load, 0, "ROB LOAD", 0); } -bool task_rob_load_append_free_req_data(CHARA_NUM chara_num) { - return task_rob_load->AppendFreeReqData(chara_num); +bool task_rob_load_append_free_req_data(CHARA_NUM cn) { + return task_rob_load->AppendFreeReqData(cn); } -bool task_rob_load_append_free_req_data_obj(CHARA_NUM chara_num, const item_cos_data* cos) { - return task_rob_load->AppendFreeReqDataObj(chara_num, cos); +bool task_rob_load_append_free_req_data_obj(CHARA_NUM cn, const RobItemEquip* item_set) { + return task_rob_load->AppendFreeReqDataObj(cn, item_set); } -bool task_rob_load_append_load_req_data(CHARA_NUM chara_num) { - return task_rob_load->AppendLoadReqData(chara_num); +bool task_rob_load_append_load_req_data(CHARA_NUM cn) { + return task_rob_load->AppendLoadReqData(cn); } -bool task_rob_load_append_load_req_data_obj(CHARA_NUM chara_num, const item_cos_data* cos) { - return task_rob_load->AppendLoadReqDataObj(chara_num, cos); +bool task_rob_load_append_load_req_data_obj(CHARA_NUM cn, const RobItemEquip* item_set) { + return task_rob_load->AppendLoadReqDataObj(cn, item_set); } bool task_rob_load_check_load_req_data() { @@ -11362,33 +11867,25 @@ bool task_rob_manager_add_task() { return app::TaskWork::add_task(task_rob_manager, "ROB_MANAGER TASK"); } -bool task_rob_manager_check_chara_loaded(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +bool task_rob_manager_check_chara_loaded(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return false; - return task_rob_manager->CheckCharaLoaded(&rob_chara_array[chara_id]); + return task_rob_manager->CheckCharaLoaded(&RobManagement::rob_impl[rob_id]); } bool task_rob_manager_check_task_ready() { return app::TaskWork::check_task_ready(task_rob_manager); } -void task_rob_manager_free_all_chara() { - for (int32_t i = 0; i < ROB_ID_MAX; i++) - if (rob_chara_array[i].type != ROB_CHARA_TYPE_NONE) { - task_rob_manager->AppendFreeCharaList(&rob_chara_array[i]); - rob_chara_array[i].type = ROB_CHARA_TYPE_NONE; - } -} - bool task_rob_manager_get_free_chara_list_empty() { return task_rob_manager->GetFreeCharaListEmpty(); } -bool task_rob_manager_get_wait(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +bool task_rob_manager_get_wait(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return false; - return task_rob_manager->GetWait(&rob_chara_array[chara_id]); + return task_rob_manager->GetWait(&RobManagement::rob_impl[rob_id]); } bool task_rob_manager_hide_task() { @@ -11407,818 +11904,216 @@ bool task_rob_manager_del_task() { return false; } -RobTransform::RobTransform() { - pos = 0.0f; - rot = 0.0f; - scale = 1.0f; - hsc = 1.0f; +MOTTABLE_TYPE expression_id_to_mottbl_type(int32_t id) { + static const MOTTABLE_TYPE expression_id_to_mottbl_type_table[] = { + MTP_FACE_SAD, + MTP_FACE_LAUGH, + MTP_FACE_CRY, + MTP_FACE_SURPRISE, + MTP_FACE_WINK_OLD, + MTP_FACE_ADMIRATION, + MTP_FACE_SMILE, + MTP_FACE_SETTLED, + MTP_FACE_DAZZLING, + MTP_FACE_LASCIVIOUS, + MTP_FACE_STRONG, + MTP_FACE_CLARIFYING, + MTP_FACE_GENTLE, + MTP_FACE_NAGASI, + MTP_FACE_RESET, + MTP_FACE_KIRI, + MTP_FACE_UTURO, + MTP_FACE_OMOU, + MTP_FACE_SETUNA, + MTP_FACE_GENKI, + MTP_FACE_YARU, + MTP_FACE_RESET, + MTP_FACE_CLOSE, + MTP_FACE_NULL, + MTP_FACE_MOT_SLOT_1, + MTP_FACE_MOT_SLOT_2, + MTP_FACE_MOT_SLOT_3, + MTP_FACE_MOT_SLOT_4, + MTP_FACE_MOT_SLOT_5, + MTP_FACE_MOT_SLOT_6, + MTP_FACE_MOT_SLOT_7, + MTP_FACE_MOT_SLOT_8, + MTP_FACE_MOT_SLOT_9, + MTP_FACE_MOT_SLOT_10, + MTP_FACE_COOL, + MTP_FACE_KOMARIWARAI, + MTP_FACE_KUMON, + MTP_FACE_KUTSUU, + MTP_FACE_NAKI, + MTP_FACE_NAYAMI, + MTP_FACE_SUPSERIOUS, + MTP_FACE_TSUYOKIWARAI, + MTP_FACE_WINK_L, + MTP_FACE_WINK_R, + MTP_FACE_WINKG_L, + MTP_FACE_WINKG_R, + MTP_FACE_RESET1, + MTP_FACE_RESET2, + MTP_FACE_RESET3, + MTP_FACE_RESET4, + MTP_FACE_RESET5, + MTP_FACE_WINK_FT_OLD, + MTP_FACE_SAD_OLD, + MTP_FACE_SURPRISE_OLD, + MTP_FACE_SMILE_OLD, + MTP_FACE_DAZZLING_OLD, + MTP_FACE_LASCIVIOUS_OLD, + MTP_FACE_STRONG_OLD, + MTP_FACE_CLARIFYING_OLD, + MTP_FACE_GENTLE_OLD, + MTP_FACE_NAGASI_OLD, + MTP_FACE_KIRI_OLD, + MTP_FACE_OMOU_OLD, + MTP_FACE_SETUNA_OLD, + MTP_FACE_NEW_IKARI_OLD, + MTP_FACE_CRY_OLD, + MTP_FACE_LAUGH_OLD, + MTP_FACE_YARU_OLD, + MTP_FACE_ADMIRATION_OLD, + MTP_FACE_GENKI_OLD, + MTP_FACE_SETTLED_OLD, + MTP_FACE_UTURO_OLD, + MTP_FACE_RESET_OLD, + MTP_FACE_CLOSE_OLD, + MTP_FACE_EYEBROW_UP_RIGHT, + MTP_FACE_EYEBROW_UP_LEFT, + MTP_FACE_KOMARIEGAO, + MTP_FACE_KONWAKU, + }; + + if (id >= 0 && id < sizeof(expression_id_to_mottbl_type_table) / sizeof(int32_t)) + return expression_id_to_mottbl_type_table[id]; + return MTP_FACE_NULL; } -void RobTransform::CalcMatrixHS(const vec3& hsc, mat4& mat, mat4& dsp_mat) { - vec3 pos = this->pos * hsc; - mat4_mul_translate(&mat, &pos, &mat); - mat4_mul_rotate_zyx(&mat, &rot, &mat); - this->hsc = scale * hsc; - dsp_mat = mat; - mat4_scale_rot(&dsp_mat, &this->hsc, &dsp_mat); +/* +195 CMN_HAND_OPEN 0 +196 CMN_HAND_CLOSE 1 +194 CMN_HAND_NORMAL 2 +197 CMN_HAND_PEACE 3 +201 CMN_HAND_NEGI 4 +198 CMN_HAND_MIC 5 +199 CMN_HAND_ONE 6 +202 CMN_HAND_SIZEN 7 +203 CMN_HAND_PICK 8 +192 (null) 9 +200 CMN_HAND_THREE 10 +204 CMN_HAND_MIC 11,12,13 +193 CMN_HAND_RESET 14*/ + +MOTTABLE_TYPE hand_anim_id_to_mottbl_type(int32_t id) { + static const MOTTABLE_TYPE hand_anim_id_to_mottbl_type_table[] = { + MTP_HAND_OPEN, + MTP_HAND_CLOSE, + MTP_HAND_NORMAL, + MTP_HAND_PEACE, + MTP_HAND_NEGI, + MTP_HAND_GOOD, + MTP_HAND_ONE, + MTP_HAND_SIZEN, + MTP_HAND_PICK, + MTP_HAND_NULL, + MTP_HAND_THREE, + MTP_HAND_MIC, + MTP_HAND_MIC, + MTP_HAND_MIC, + MTP_HAND_RESET, + }; + + if (id >= 0 && id < sizeof(hand_anim_id_to_mottbl_type_table) / sizeof(int32_t)) + return hand_anim_id_to_mottbl_type_table[id]; + return MTP_HAND_NULL; } -void RobTransform::init(float_t px, float_t py, float_t pz, - float_t rx, float_t ry, float_t rz) { - pos.x = px; - pos.y = py; - pos.z = pz; - rot.x = rx; - rot.z = ry; - rot.y = rz; - scale = 1.0f; - hsc = 1.0f; +MOTTABLE_TYPE look_anim_id_to_mottbl_type(int32_t id) { + static const MOTTABLE_TYPE look_anim_id_to_mottbl_type_table[] = { + MTP_EYES_UP, + MTP_EYES_DOWN, + MTP_EYES_RIGHT, + MTP_EYES_LEFT, + MTP_EYES_UP_RIGHT, + MTP_EYES_UP_LEFT, + MTP_EYES_DOWN_RIGHT, + MTP_EYES_DOWN_LEFT, + MTP_EYES_RESET, + MTP_EYES_NULL, + MTP_EYES_BASE_MOT, + MTP_EYES_UP_OLD, + MTP_EYES_DOWN_OLD, + MTP_EYES_RIGHT_OLD, + MTP_EYES_LEFT_OLD, + MTP_EYES_UP_RIGHT_OLD, + MTP_EYES_UP_LEFT_OLD, + MTP_EYES_DOWN_RIGHT_OLD, + MTP_EYES_DOWN_LEFT_OLD, + MTP_EYES_RESET_OLD, + }; + + if (id >= 0 && id < sizeof(look_anim_id_to_mottbl_type_table) / sizeof(int32_t)) + return look_anim_id_to_mottbl_type_table[id]; + return MTP_EYES_NULL; } -void RobTransform::init(const vec3& p, const vec3& r) { - pos = p; - rot = r; - scale = 1.0f; - hsc = 1.0f; -} - -void RobTransform::reset() { - pos = 0.0f; - rot = 0.0f; - scale = 1.0f; - hsc = 1.0f; -} - -void RobTransform::reset_scale() { - scale = 1.0f; - hsc = 1.0f; -} - -RobNode::RobNode() : name(), mat_ptr(), parent(), no_scale_mat() { - -} - -float_t* RobNode::get_transform_component(size_t index, Expr_type& type) { - switch (index) { - case 0: - type = Expr_variable; - return &transform.pos.x; - case 1: - type = Expr_variable; - return &transform.pos.y; - case 2: - type = Expr_variable; - return &transform.pos.z; - case 3: - type = Expr_variable_rad; - return &transform.rot.x; - case 4: - type = Expr_variable_rad; - return &transform.rot.y; - case 5: - type = Expr_variable_rad; - return &transform.rot.z; - case 6: - type = Expr_variable; - return &transform.scale.x; - case 7: - type = Expr_variable; - return &transform.scale.y; - case 8: - type = Expr_variable; - return &transform.scale.z; - default: - return 0; - } -} - -const float_t* RobNode::get_transform_component(size_t index, Expr_type& type) const { - switch (index) { - case 0: - type = Expr_variable; - return &transform.pos.x; - case 1: - type = Expr_variable; - return &transform.pos.y; - case 2: - type = Expr_variable; - return &transform.pos.z; - case 3: - type = Expr_variable_rad; - return &transform.rot.x; - case 4: - type = Expr_variable_rad; - return &transform.rot.y; - case 5: - type = Expr_variable_rad; - return &transform.rot.z; - case 6: - type = Expr_variable; - return &transform.scale.x; - case 7: - type = Expr_variable; - return &transform.scale.y; - case 8: - type = Expr_variable; - return &transform.scale.z; - default: - return 0; - } -} - -void RobNode::set_name_mat_no_scale_mat(const char* name, mat4* mat, mat4* no_scale_mat) { - this->name = name; - - this->mat_ptr = mat; - if (mat) - *mat = mat4_identity; - - parent = 0; - transform.reset(); - - this->no_scale_mat = no_scale_mat; - if (no_scale_mat) - *no_scale_mat = mat4_identity; -} - -mot_key_data::mot_key_data() : key_sets_ready(), key_set_count(), key_set(), -mot(), fc_value(), mot_data(), skeleton_type(), skeleton_select(), field_68() { - motion_id = -1; - frame = -1.0f; -} - -mot_key_data::~mot_key_data() { - -} - -void mot_key_data::interpolate(float_t frame, uint32_t key_set_offset, uint32_t key_set_count) { - mot_interpolate(&mot, frame, &fc_value.data()[key_set_offset], - &key_set.data()[key_set_offset], key_set_count, &field_68); -} - -void mot_key_data::reset() { - key_sets_ready = 0; - skeleton_type = BONE_KIND_NONE; - frame = -1.0f; - key_set_count = 0; - mot_data = 0; - skeleton_select = 0; - field_68 = {}; - - key_set.clear(); - fc_value.clear(); - motion_id = -1; -} - -eyes_adjust::eyes_adjust() : xrot_adjust(), base_adjust() { - neg = -1.0f; - pos = -1.0f; -} - -RobBlock::RobBlock() : ik_type(), inherit_type(), block_id(), flip_block_id(), -inherit_mat_id(), expression_id(), key_set_offset(), key_set_count(), frame(), -up_vector_mat_ptr(), inherit_mat_ptr(), node(), len(), arm_length() { - eyes_xrot_adjust_neg = 1.0f; - eyes_xrot_adjust_pos = 1.0f; -} - -RobBlock::~RobBlock() { - -} - -void RobBlock::copy_rot_trans(const RobBlock& other) { - if (check_expression_id_not_null()) - return; - - switch (ik_type) { - case IKT_0N: - case IKT_0T: - case IKT_ROOT: - leaf_pos[0] = other.leaf_pos[0]; - smooth_pos[0] = other.smooth_pos[0]; - break; - } - - switch (ik_type) { - case IKT_0: - case IKT_0N: - case IKT_0T: - case IKT_ROOT: - chain_rot[0] = other.chain_rot[0]; - smooth_rot[0][0] = other.smooth_rot[0][0]; - break; - case IKT_1: - chain_rot[0] = other.chain_rot[0]; - chain_rot[1] = other.chain_rot[1]; - smooth_rot[0][0] = other.smooth_rot[0][0]; - smooth_rot[1][0] = other.smooth_rot[1][0]; - break; - case IKT_2: - case IKT_2R: - chain_rot[0] = other.chain_rot[0]; - chain_rot[1] = other.chain_rot[1]; - chain_rot[2] = other.chain_rot[2]; - smooth_rot[0][0] = other.smooth_rot[0][0]; - smooth_rot[1][0] = other.smooth_rot[1][0]; - smooth_rot[2][0] = other.smooth_rot[2][0]; - break; - } -} - -bool RobBlock::check_expression_id_not_null() { - return !!expression_id; -} - -bool RobBlock::get_constraint_ik(const RobBlock* bones) { - vec3 target; - - switch (block_id) { - case BLK_N_SKATA_L_WJ_CD_EX: - mat4_get_translation(bones[BLK_C_KATA_L].node[2].mat_ptr, &target); - orient_x(target); - break; - case BLK_N_SKATA_R_WJ_CD_EX: - mat4_get_translation(bones[BLK_C_KATA_R].node[2].mat_ptr, &target); - orient_x(target); - break; - case BLK_N_SKATA_B_L_WJ_CD_CU_EX: - mat4_get_translation(bones[BLK_N_UP_KATA_L_EX].node[0].mat_ptr, &target); - orient_x_cns(target, 0.333f); - break; - case BLK_N_SKATA_B_R_WJ_CD_CU_EX: - mat4_get_translation(bones[BLK_N_UP_KATA_R_EX].node[0].mat_ptr, &target); - orient_x_cns(target, 0.333f); - break; - case BLK_N_SKATA_C_L_WJ_CD_CU_EX: - mat4_get_translation(bones[BLK_N_UP_KATA_L_EX].node[0].mat_ptr, &target); - orient_x_cns(target, 0.5f); - break; - case BLK_N_SKATA_C_R_WJ_CD_CU_EX: - mat4_get_translation(bones[BLK_N_UP_KATA_R_EX].node[0].mat_ptr, &target); - orient_x_cns(target, 0.5f); - break; - case BLK_N_MOMO_A_L_WJ_CD_EX: - mat4_get_translation(bones[BLK_CL_MOMO_L].node[2].mat_ptr, &target); - mat4_inverse_transform_point(node[0].mat_ptr, &target, &target); - orient_y(-target); - break; - case BLK_N_MOMO_A_R_WJ_CD_EX: - mat4_get_translation(bones[BLK_CL_MOMO_R].node[2].mat_ptr, &target); - mat4_inverse_transform_point(node[0].mat_ptr, &target, &target); - orient_y(-target); - break; - case BLK_N_HARA_CD_EX: - mat4_get_translation(bones[BLK_KL_MUNE_B_WJ].node[0].mat_ptr, &target); - mat4_inverse_transform_point(node[0].mat_ptr, &target, &target); - orient_y(target); - break; - default: - return false; - } - return true; -} - -bool RobBlock::get_ex_rotation(RobTransform& transform, const RobBlock* bones) { - RobNode* node; - - switch (block_id) { - case BLK_N_EYE_L_WJ_EX: - transform.rot.x = -bones[BLK_KL_EYE_L].node[0].transform.rot.x; - transform.rot.y = bones[BLK_KL_EYE_L].node[0].transform.rot.y * (float_t)(-1.0 / 2.0); - break; - case BLK_N_EYE_R_WJ_EX: - transform.rot.x = -bones[BLK_KL_EYE_R].node[0].transform.rot.x; - transform.rot.y = bones[BLK_KL_EYE_R].node[0].transform.rot.y * (float_t)(-1.0 / 2.0); - break; - case BLK_N_KUBI_WJ_EX: { - mat4 mat = bones[BLK_CL_KAO].chain_rot[0]; - mat4_mul(&bones[BLK_CL_KAO].chain_rot[1], &mat, &mat); - - vec3 rotation; - mat4_get_rotation_zyx(&mat, &rotation); - - float_t rot = rotation.z; - if (rot < (float_t)-M_PI_2) - rot += (float_t)(M_PI * 2.0); - transform.rot.y = (rot - (float_t)M_PI_2) * 0.2f; - } break; - case BLK_N_HITO_L_EX: - case BLK_N_HITO_R_EX: - transform.rot.z = (float_t)(-9.0 * DEG_TO_RAD); - break; - case BLK_N_KO_L_EX: - transform.rot.x = (float_t)(-8.0 * DEG_TO_RAD); - transform.rot.z = (float_t)(16.0 * DEG_TO_RAD); - break; - case BLK_N_KUSU_L_EX: - case BLK_N_KUSU_R_EX: - transform.rot.z = (float_t)(9.0 * DEG_TO_RAD); - break; - case BLK_N_NAKA_L_EX: - case BLK_N_NAKA_R_EX: - transform.rot.z = (float_t)(-1.0 * DEG_TO_RAD); - break; - case BLK_N_OYA_L_EX: - transform.rot.x = (float_t)(75.0 * DEG_TO_RAD); - transform.rot.y = (float_t)(12.0 * DEG_TO_RAD); - transform.rot.z = (float_t)(-24.0 * DEG_TO_RAD); - break; - case BLK_N_STE_L_WJ_EX: - transform.rot.x = bones[BLK_KL_TE_L_WJ].node[0].transform.rot.x; - break; - case BLK_N_SUDE_L_WJ_EX: - case BLK_N_SUDE_B_L_WJ_EX: - node = &bones[BLK_KL_TE_L_WJ].node[0]; - transform.rot.x = RobBlock::limit_angle(node->transform.rot.x) * (float_t)(1.0 / 3.0); - break; - case BLK_N_SUDE_R_WJ_EX: - case BLK_N_SUDE_B_R_WJ_EX: - node = &bones[BLK_KL_TE_R_WJ].node[0]; - transform.rot.x = RobBlock::limit_angle(node->transform.rot.x) * (float_t)(1.0 / 3.0); - break; - case BLK_N_HIJI_L_WJ_EX: - transform.rot.z = bones[BLK_C_KATA_L].node[2].transform.rot.z * (float_t)(1.0 / 2.0); - break; - case BLK_N_UP_KATA_L_EX: - case BLK_N_UP_KATA_R_EX: - break; - case BLK_N_KO_R_EX: - transform.rot.x = (float_t)(8.0 * DEG_TO_RAD); - transform.rot.z = (float_t)(16.0 * DEG_TO_RAD); - break; - case BLK_N_OYA_R_EX: - transform.rot.x = (float_t)(-75.0 * DEG_TO_RAD); - transform.rot.y = (float_t)(-12.0 * DEG_TO_RAD); - transform.rot.z = (float_t)(-24.0 * DEG_TO_RAD); - break; - case BLK_N_STE_R_WJ_EX: - transform.rot.x = bones[BLK_KL_TE_R_WJ].node[0].transform.rot.x; - break; - case BLK_N_HIJI_R_WJ_EX: - transform.rot.z = bones[BLK_C_KATA_R].node[2].transform.rot.z * (float_t)(1.0 / 2.0); - break; - case BLK_N_HIZA_L_WJ_EX: - transform.rot.z = bones[BLK_CL_MOMO_L].node[2].transform.rot.z * (float_t)(1.0 / 2.0); - break; - case BLK_N_HIZA_R_WJ_EX: - transform.rot.z = bones[BLK_CL_MOMO_R].node[2].transform.rot.z * (float_t)(1.0 / 2.0); - break; - case BLK_N_MOMO_B_L_WJ_EX: - case BLK_N_MOMO_C_L_WJ_EX: - node = &bones[BLK_CL_MOMO_L].node[0]; - transform.rot.y = RobBlock::limit_angle(node->transform.rot.y - + node->transform.rot.x) * (float_t)(1.0 / 3.0); - break; - case BLK_N_MOMO_B_R_WJ_EX: - case BLK_N_MOMO_C_R_WJ_EX: - node = &bones[BLK_CL_MOMO_R].node[0]; - transform.rot.y = RobBlock::limit_angle(node->transform.rot.y - + node->transform.rot.x) * (float_t)(1.0 / 3.0); - break; - case BLK_N_HARA_B_WJ_EX: - transform.rot.y = bones[BLK_CL_MUNE].node[0].transform.rot.y * (float_t)(1.0 / 3.0) - + bones[BLK_KL_KOSI_Y].node[0].transform.rot.y * (float_t)(2.0 / 3.0); - break; - case BLK_N_HARA_C_WJ_EX: - transform.rot.y = bones[BLK_CL_MUNE].node[0].transform.rot.y * (float_t)(2.0 / 3.0) - + bones[BLK_KL_KOSI_Y].node[0].transform.rot.y * (float_t)(1.0 / 3.0); - break; - default: - return false; - } - return true; -} - -void RobBlock::get_mat(int32_t skeleton_select) { - if (check_expression_id_not_null()) - return; - - mat4 mat = inherit_type ? *inherit_mat_ptr : mat4_identity; - - if (ik_type == IKT_0T) { - mat4_mul_translate(&mat, &leaf_pos[0], &mat); - chain_rot[0] = mat4_identity; - } - else if (ik_type == IKT_0N) { - mat4_inverse_transform_point(&mat, &leaf_pos[0], &leaf_pos[0]); - mat4_mul_translate(&mat, &leaf_pos[0], &mat); - chain_rot[0] = mat4_identity; - } - else { - if (block_id == BLK_KL_EYE_L || block_id == BLK_KL_EYE_R) { - if (chain_ang.x > 0.0f) - chain_ang.x *= eyes_xrot_adjust_pos; - else if (chain_ang.x < 0.0f) - chain_ang.x *= eyes_xrot_adjust_neg; - } - - mat4 chain_rot; - if (ik_type == IKT_ROOT) - mat4_mul_rotate_zyx(&this->chain_rot[0], &chain_ang, &chain_rot); - else { - leaf_pos[0] = chain_pos[skeleton_select]; - mat4_rotate_zyx(&chain_ang, &chain_rot); - } - - mat4_mul_translate(&mat, &leaf_pos[0], &mat); - mat4_mul(&chain_rot, &mat, &mat); - this->chain_rot[0] = chain_rot; - } - - *node[0].mat_ptr = mat; - - get_mat_ik(skeleton_select); -} - -void RobBlock::get_mat_ik(int32_t skeleton_select) { - if (ik_type < IKT_1) - return; - - mat4 mat = *node[0].mat_ptr; - - vec3 local_target; - mat4_inverse_transform_point(&mat, &leaf_pos[1], &local_target); - - float_t target_len_xy_sq = vec2::length_squared(*(vec2*)&local_target); - float_t target_len_sq = vec3::length_squared(local_target); - float_t target_len_xy = sqrtf(target_len_xy_sq); - float_t target_len = sqrtf(target_len_sq); - mat4 chain_rot; - if (fabsf(target_len_xy) > 0.000001f && fabsf(target_len_sq) > 0.000001f) { - mat4_rotate_z((1.0f / target_len_xy) * local_target.y, - (1.0f / target_len_xy) * local_target.x, &chain_rot); - mat4_mul_rotate_y(&chain_rot, -(1.0f / target_len) * local_target.z, - (1.0f / target_len) * target_len_xy, &chain_rot); - mat4_mul(&chain_rot, &mat, &mat); - } - else - chain_rot = mat4_identity; - - if (up_vector_mat_ptr) { - vec3 up_vector; - mat4_get_translation(up_vector_mat_ptr, &up_vector); - mat4_inverse_transform_point(&mat, &up_vector, &up_vector); - float_t up_vector_length = vec2::length(*(vec2*)&up_vector.y); - if (up_vector_length > 0.000001f) { - up_vector *= 1.0f / up_vector_length; - float_t rot_cos = up_vector.y; - float_t rot_sin = up_vector.z; - mat4_mul_rotate_x(&mat, rot_sin, rot_cos, &mat); - mat4_mul_rotate_x(&chain_rot, rot_sin, rot_cos, &chain_rot); - } - } - - if (ik_type == IKT_1) { - this->chain_rot[1] = chain_rot; - *node[1].mat_ptr = mat; - mat4_mul_translate(&mat, len[0][skeleton_select], 0.0f, 0.0f, &mat); - - *node[2].mat_ptr = mat; - return; - } - - float_t len0 = len[0][skeleton_select]; - float_t len1 = len[1][skeleton_select]; - float_t rot_sin; - float_t rot_cos; - float_t rot_2nd_sin; - float_t rot_2nd_cos; - if (target_len_sq > 0.000001f) { - if (arm_length > 0.0001f) { - float_t max_reach = (len0 + len1) * arm_length; - if (target_len > max_reach) { - target_len = max_reach; - target_len_sq = max_reach * max_reach; - } - } - - float_t proj_length = (target_len_sq - len1 * len1) / len0; - rot_cos = (proj_length + len0) / (2.0f * target_len); - rot_2nd_cos = (proj_length - len0) / (2.0f * len1); - - rot_cos = clamp_def(rot_cos, -1.0f, 1.0f); - rot_2nd_cos = clamp_def(rot_2nd_cos, -1.0f, 1.0f); - - rot_sin = sqrtf(1.0f - rot_cos * rot_cos); - rot_2nd_sin = sqrtf(1.0f - rot_2nd_cos * rot_2nd_cos); - if (ik_type == IKT_2R) - rot_sin = -rot_sin; - else - rot_2nd_sin = -rot_2nd_sin; - } - else { - rot_sin = 0.0f; - rot_cos = 1.0f; - rot_2nd_sin = 0.0f; - rot_2nd_cos = -1.0f; - } - - mat4_mul_rotate_z(&mat, rot_sin, rot_cos, &mat); - *node[1].mat_ptr = mat; - mat4_mul_rotate_z(&chain_rot, rot_sin, rot_cos, &chain_rot); - this->chain_rot[1] = chain_rot; - mat4_mul_translate(&mat, len0, 0.0f, 0.0f, &mat); - - mat4_mul_rotate_z(&mat, rot_2nd_sin, rot_2nd_cos, &mat); - *node[2].mat_ptr = mat; - mat4_rotate_z(rot_2nd_sin, rot_2nd_cos, &chain_rot); - this->chain_rot[2] = chain_rot; - mat4_mul_translate(&mat, len1, 0.0f, 0.0f, &mat); - - *node[3].mat_ptr = mat; -} - -void RobBlock::mult_mat(const mat4& parent_mat, const RobBlock* bones, bool solve_ik) { - mat4 mat = inherit_type ? *inherit_mat_ptr : parent_mat; - - if (ik_type != IKT_0N && ik_type != IKT_0T) { - if (ik_type != IKT_ROOT) - leaf_pos[0] = chain_pos[1]; - - mat4_mul_translate(&mat, &leaf_pos[0], &mat); - if (solve_ik) { - node[0].transform.rot = 0.0f; - if (!check_expression_id_not_null()) - mat4_get_rotation_zyx(&chain_rot[0], &node[0].transform.rot); - else if (get_ex_rotation(node[0].transform, bones)) - mat4_rotate_zyx(&node[0].transform.rot, &chain_rot[0]); - else { - *node[0].mat_ptr = mat; - - if (get_constraint_ik(bones)) { - mat4 chain_rot; - mat4_invert_rotation_fast(&mat, &chain_rot); - mat4_mul(node[0].mat_ptr, &chain_rot, &chain_rot); - mat4_clear_trans(&chain_rot, &chain_rot); - mat4_get_rotation_zyx(&chain_rot, &node[0].transform.rot); - this->chain_rot[0] = chain_rot; - } - else - chain_rot[0] = mat4_identity; - } - } - - mat4_mul(&chain_rot[0], &mat, &mat); - } - else { - mat4_mul_translate(&mat, &leaf_pos[0], &mat); - if (solve_ik) - node[0].transform.rot = 0.0f; - } - - *node[0].mat_ptr = mat; - - if (solve_ik) { - node[0].transform.pos = leaf_pos[0]; - node[0].transform.reset_scale(); - } - - if (ik_type < IKT_1) - return; - - mat4_mul(&chain_rot[1], &mat, &mat); - *node[1].mat_ptr = mat; - - if (ik_type == IKT_1) { - mat4_mul_translate(&mat, len[0][1], 0.0f, 0.0f, &mat); - *node[2].mat_ptr = mat; - - if (solve_ik) { - node[1].transform.pos = 0.0f; - mat4_get_rotation_zyx(&chain_rot[1], &node[1].transform.rot); - node[1].transform.reset_scale(); - - node[2].transform.init(len[0][1], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - } - } - else { - mat4_mul_translate(&mat, len[0][1], 0.0f, 0.0f, &mat); - mat4_mul(&chain_rot[2], &mat, &mat); - *node[2].mat_ptr = mat; - - mat4_mul_translate(&mat, len[1][1], 0.0f, 0.0f, &mat); - *node[3].mat_ptr = mat; - - if (solve_ik) { - node[1].transform.pos = 0.0f; - mat4_get_rotation_zyx(&chain_rot[1], &node[1].transform.rot); - node[1].transform.reset_scale(); - - node[2].transform.pos = { len[0][1], 0.0f, 0.0f }; - mat4_get_rotation_zyx(&chain_rot[2], &node[2].transform.rot); - node[2].transform.reset_scale(); - - node[3].transform.init(len[1][1], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); - } - } -} - -void RobBlock::orient_x(const vec3& target) { - vec3 x_axis; - mat4_inverse_transform_point(node[0].mat_ptr, &target, &x_axis); - - float_t len; - len = vec3::length_squared(x_axis); - if (len <= 0.000001f) - return; - - len = sqrtf(len); - if (len != 0.0f) - x_axis *= 1.0f / len; - - // Gram-Schmidt process, but hacky - vec3 z_axis; - z_axis.x = x_axis.y * 0.0f - x_axis.x * x_axis.z - x_axis.z; - z_axis.y = x_axis.z * -x_axis.y - 0.0f * x_axis.x; - z_axis.z = x_axis.x * x_axis.x - -x_axis.y * x_axis.y + x_axis.x; - - // Written other way - //vec3 z_axis = vec3::cross(x_axis, vec3(-x_axis.y, x_axis.x, 0.0f)) + vec3(-x_axis.z, 0.0f, x_axis.x); - - // Expanded - //vec3 z_axis = vec3::cross(x_axis, vec3::cross(vec3(0.0f, 0.0f, 1.0f), x_axis)) - // + vec3::cross(x_axis, vec3(0.0f, 1.0f, 0.0f)); - - len = vec3::length_squared(z_axis); - if (len <= 0.000001f) - return; - - len = sqrtf(len); - if (len != 0.0f) - z_axis *= 1.0f / len; - - vec3 y_axis = vec3::cross(z_axis, x_axis); - - mat4 chain_rot; - mat4_set_row(&chain_rot, 0, x_axis.x, x_axis.y, x_axis.z, 0.0f); - mat4_set_row(&chain_rot, 1, y_axis.x, y_axis.y, y_axis.z, 0.0f); - mat4_set_row(&chain_rot, 2, z_axis.x, z_axis.y, z_axis.z, 0.0f); - mat4_set_row(&chain_rot, 3, 0.0f, 0.0f, 0.0f, 1.0f); - - mat4_mul(&chain_rot, node[0].mat_ptr, node[0].mat_ptr); -} - -void RobBlock::orient_x_cns(const vec3& target, float_t weight) { - vec3 local_target; - mat4_inverse_transform_point(node[0].mat_ptr, &target, &local_target); - local_target.x = 0.0f; - - float_t len = vec2::length(*(vec2*)&local_target.y); - if (fabsf(len) > 0.000001f) { - float_t angle = atan2f((1.0f / len) * local_target.z, (1.0f / len) * local_target.y); - mat4_mul_rotate_x(node[0].mat_ptr, angle * weight, node[0].mat_ptr); - } -} - -void RobBlock::orient_y(vec3 y_axis) { - float_t len; - len = vec3::length_squared(y_axis); - if (len <= 0.000001f) - return; - - len = sqrtf(len); - if (len != 0.0f) - y_axis *= 1.0f / len; - - // Gram-Schmidt process, but hacky - vec3 z_axis; - z_axis.x = -y_axis.x * y_axis.z - y_axis.y * 0.0f; - z_axis.y = 0.0f * y_axis.x - y_axis.z * y_axis.y - y_axis.z; - z_axis.z = y_axis.y * y_axis.y - y_axis.x * -y_axis.x + y_axis.y; - - // Written other way - //vec3 z_axis = vec3::cross(vec3(y_axis.y, -y_axis.x, 0.0f), y_axis) + vec3(0.0f, -y_axis.z, y_axis.y); - - // Expanded - //vec3 z_axis = vec3::cross(vec3::cross(y_axis, vec3(0.0f, 0.0f, 1.0f)), y_axis) - // + vec3::cross(vec3(1.0f, 0.0f, 0.0f), y_axis); - - len = vec3::length_squared(z_axis); - if (len <= 0.000001f) - return; - - len = sqrtf(len); - if (len != 0.0f) - z_axis *= 1.0f / len; - - vec3 x_axis = vec3::cross(y_axis, z_axis); - - mat4 chain_rot; - mat4_set_row(&chain_rot, 0, x_axis.x, x_axis.y, x_axis.z, 0.0f); - mat4_set_row(&chain_rot, 1, y_axis.x, y_axis.y, y_axis.z, 0.0f); - mat4_set_row(&chain_rot, 2, z_axis.x, z_axis.y, z_axis.z, 0.0f); - mat4_set_row(&chain_rot, 3, 0.0f, 0.0f, 0.0f, 1.0f); - - mat4_mul(&chain_rot, node[0].mat_ptr, node[0].mat_ptr); -} - -const vec3* RobBlock::set_global_leaf_sub(const vec3* val, BONE_KIND kind, bool get_data, bool flip_x) { - if (ik_type == IKT_ROOT) { - if (get_data) { - leaf_pos[0] = *val; - if (flip_x) - leaf_pos[0].x = -leaf_pos[0].x; - } - val++; - } - else if (ik_type == IKT_1 || ik_type == IKT_2 || ik_type == IKT_2R) { - if (get_data) { - leaf_pos[1] = *val; - if (flip_x) - leaf_pos[1].x = -leaf_pos[1].x; - } - val++; - } - - if (get_data) { - if (ik_type == IKT_0N || ik_type == IKT_0T) { - leaf_pos[0] = *val; - if (flip_x) - leaf_pos[0].x = -leaf_pos[0].x; - } - else if (!expression_id) { - chain_ang = *val; - if (flip_x) { - const skeleton_rotation_offset* rot_off = skeleton_rotation_offset_array; - size_t index = block_id; - if (rot_off[index].x) - chain_ang.x = rot_off[index].rotation.x - chain_ang.x; - if (rot_off[index].y) - chain_ang.y = rot_off[index].rotation.y - chain_ang.y; - if (rot_off[index].z) - chain_ang.z = rot_off[index].rotation.z - chain_ang.z; - } - } - } - val++; - return val; -} - -void RobBlock::store_curr_rot_trans(int32_t skeleton_select) { - if (check_expression_id_not_null()) - return; - - switch (ik_type) { - case IKT_0N: - case IKT_0T: - case IKT_ROOT: - smooth_pos[skeleton_select] = leaf_pos[0]; - break; - } - - switch (ik_type) { - case IKT_0: - smooth_rot[0][skeleton_select] = chain_rot[0]; - break; - case IKT_0N: - case IKT_0T: - case IKT_ROOT: - smooth_rot[0][skeleton_select] = chain_rot[0]; - break; - case IKT_1: - smooth_rot[0][skeleton_select] = chain_rot[0]; - smooth_rot[1][skeleton_select] = chain_rot[1]; - break; - case IKT_2: - case IKT_2R: - smooth_rot[0][skeleton_select] = chain_rot[0]; - smooth_rot[1][skeleton_select] = chain_rot[1]; - smooth_rot[2][skeleton_select] = chain_rot[2]; - break; - } -} - -float_t RobBlock::limit_angle(float_t angle) { - bool neg; - if (angle < 0.0f) { - angle = -angle; - neg = true; - } - else - neg = false; - - angle = fmodf(angle + (float_t)M_PI, (float_t)(M_PI * 2.0)) - (float_t)M_PI; - if (neg) - return -angle; - else - return angle; -} - -// 0x1401EB410 -void RobBlock::orient_to_target(mat4& mat, vec3 target, vec3 source) { - target = vec3::normalize(target); - source = vec3::normalize(source); - - vec3 axis = vec3::cross(source, target); - - float_t c = clamp_def(vec3::dot(source, target), -1.0f, 1.0f); - float_t s = sqrtf(clamp_def(1.0f - c * c, 0.0f, 1.0f)); - mat4_set(&axis, -s, c, &mat); +MOTTABLE_TYPE mouth_anim_id_to_mottbl_type(int32_t id) { + static const MOTTABLE_TYPE mouth_anim_id_to_mottbl_type_table[] = { + MTP_KUCHI_A, + MTP_KUCHI_E, + MTP_KUCHI_O, + MTP_KUCHI_SURPRISE, + MTP_KUCHI_HE, + MTP_KUCHI_SMILE, + MTP_KUCHI_NIYA, + MTP_KUCHI_CHU, + MTP_KUCHI_RESET, + MTP_KUCHI_NULL, + MTP_KUCHI_I, + MTP_KUCHI_U, + MTP_KUCHI_E_DOWN, + MTP_KUCHI_HAMISE, + MTP_KUCHI_HAMISE_DOWN, + MTP_KUCHI_HE_S, + MTP_KUCHI_HERAHERA, + MTP_KUCHI_MOGUMOGU, + MTP_KUCHI_NEKO, + MTP_KUCHI_SAKEBI, + MTP_KUCHI_SAKEBI_L, + MTP_KUCHI_SMILE_L, + MTP_KUCHI_NEUTRAL, + MTP_KUCHI_NIYA_OLD, + MTP_KUCHI_A_OLD, + MTP_KUCHI_O_OLD, + MTP_KUCHI_SURPRISE_OLD, + MTP_KUCHI_HE_OLD, + MTP_KUCHI_RESET_OLD, + MTP_KUCHI_I_OLD, + MTP_KUCHI_U_OLD, + MTP_KUCHI_E_OLD, + MTP_KUCHI_SMILE_OLD, + MTP_KUCHI_CHU_OLD, + MTP_KUCHI_PSP_A, + MTP_KUCHI_PSP_E, + MTP_KUCHI_PSP_O, + MTP_KUCHI_PSP_SURPRISE, + MTP_KUCHI_PSP_NIYA, + MTP_KUCHI_PSP_NIYARI, + MTP_KUCHI_HAMISE_E, + MTP_KUCHI_SANKAKU, + MTP_KUCHI_SHIKAKU, + }; + + if (id >= 0 && id < sizeof(mouth_anim_id_to_mottbl_type_table) / sizeof(int32_t)) + return mouth_anim_id_to_mottbl_type_table[id]; + return MTP_KUCHI_NULL; } bone_data_parent::bone_data_parent() : rob_bone_data(), -motion_bone_count(), leaf_pos(), chain_pos(), -bone_key_set_count(), global_key_set_count(), rot_y() { +block_max(), leaf_pos_max(), chain_pos_max(), +bone_key_set_count(), global_key_set_count(), yrot() { } @@ -12226,11 +12121,82 @@ bone_data_parent::~bone_data_parent() { } +// 0x1404102E0 +void bone_data_parent::ik_init(const std::vector* body_type_table, + const CHAINPOSRADIUS* joint_table, const CHAINPOSRADIUS* disp_joint_table) { + rob_chara_bone_data* rob_bone_data = this->rob_bone_data; + size_t chain_pos = 0; + size_t node_count = 0; + size_t leaf_pos = 0; + + RobBlock* block = block_vec.data(); + for (const BODYTYPE& i : *body_type_table) { + block->block_id = (BONE_BLK)(&i - body_type_table->data()); + block->ik_type = i.ik_type; + block->flip_block_id = (BONE_BLK)i.flip_block_id; + block->inherit_mat_id = (BONE_BLK)i.inherit_mat_id; + block->expression_id = i.expression_id; + block->key_set_count = i.ik_type >= IKT_ROOT ? 6 : 3; + block->chain_pos[0] = (*joint_table++).chain_pos; + block->chain_pos[1] = (*disp_joint_table++).chain_pos; + block->node = &rob_bone_data->node_vec[node_count]; + block->inherit_type = i.inherit_type; + block->inherit_mat_ptr = i.inherit_type ? &rob_bone_data->mat_vec[i.inherit_mat_id] : 0; + + block->up_vector_mat_ptr = 0; + switch (i.ik_type) { + case IKT_0: + case IKT_0N: + case IKT_0T: + chain_pos++; + node_count++; + break; + case IKT_ROOT: + chain_pos++; + leaf_pos++; + node_count++; + break; + case IKT_1: + block->len[0][0] = (*joint_table++).chain_pos.x; + block->len[0][1] = (*disp_joint_table++).chain_pos.x; + + chain_pos += 2; + leaf_pos++; + node_count += 3; + break; + case IKT_2: + case IKT_2R: + block->len[0][0] = (*joint_table++).chain_pos.x; + block->len[0][1] = (*disp_joint_table++).chain_pos.x; + block->len[1][0] = (*joint_table++).chain_pos.x; + block->len[1][1] = (*disp_joint_table++).chain_pos.x; + + mat4* up_vector_mat = 0; + if (i.up_vector_id) + up_vector_mat = &rob_bone_data->mat_vec[i.up_vector_id]; + block->up_vector_mat_ptr = up_vector_mat; + + chain_pos += 3; + leaf_pos++; + node_count += 4; + break; + } + block++; + } + + if (node_count != rob_bone_data->node_max) + printf_debug_error("Node mismatch"); + if (leaf_pos != leaf_pos_max) + printf_debug_error("LeafPos mismatch"); + if (chain_pos != chain_pos_max) + printf_debug_error("ChainPos mismatch"); +} + void mot_play_frame_data::reset() { frame = -1.0f; step = 1.0f; step_prev = 1.0f; - frame_count = 0.0f; + frame_max = 0.0f; last_frame = -1.0f; max_frame = -1.0f; playback_state = MOT_PLAY_FRAME_DATA_PLAYBACK_NONE; @@ -12258,11 +12224,29 @@ void mot_play_data::reset() { ext_step = 0; } -struc_308::struc_308() : field_0(), field_4(), field_8(), field_8C(), -rot_y(), prev_rot_y(), field_BC(), field_BD(), field_C0(), field_C4() { +MotionSmooth::MotionSmooth() : field_0(), field_4(), field_8(), base_mtx_set(), +move_yang(), move_yang_bef(), root_ypos(), root_xzpos(), field_C0(), field_C4() { } +void MotionSmooth::reset() { + field_0 = 0; + field_8 = 0; + base_mtx = mat4_identity; + base_mtx_bef = mat4_identity; + base_mtx_set = false; + move_yang = 0.0f; + move_yang_bef = 0.0f; + field_90 = 1.0f; + field_9C = 1.0f; + field_A8 = 1.0f; + root_ypos = 0; + root_xzpos = 0; + field_C0 = 1.0f; + field_C4 = 1.0f; + field_C8 = 0.0f; +} + MotionBlend::MotionBlend() : field_8(), enable(), duration(), frame(), offset(), blend() { step = 1.0f; } @@ -12338,7 +12322,7 @@ void MotionBlendCross::Step(struc_400* a2) { } if (enable) - mat4_rotate_y(-a2->prev_rot_y, &rot_y_mat); + mat4_rotate_y(-a2->move_yang_bef, &rot_y_mat); else rot_y_mat = mat4_identity; } @@ -12382,16 +12366,16 @@ void MotionBlendCross::Blend(RobBlock* curr, RobBlock* prev) { break; case IKT_0N: case IKT_0T: - curr->leaf_pos[0] = vec3::lerp(prev->leaf_pos[0], curr->leaf_pos[0], blend); + curr->leaf_pos[1] = vec3::lerp(prev->leaf_pos[1], curr->leaf_pos[1], blend); break; case IKT_ROOT: if (trans_xz) { - curr->leaf_pos[0].x = lerp_def(prev->leaf_pos[0].x, curr->leaf_pos[0].x, blend); - curr->leaf_pos[0].z = lerp_def(prev->leaf_pos[0].z, curr->leaf_pos[0].z, blend); + curr->leaf_pos[1].x = lerp_def(prev->leaf_pos[1].x, curr->leaf_pos[1].x, blend); + curr->leaf_pos[1].z = lerp_def(prev->leaf_pos[1].z, curr->leaf_pos[1].z, blend); } if (trans_y) - curr->leaf_pos[0].y = lerp_def(prev->leaf_pos[0].y, curr->leaf_pos[0].y, blend); + curr->leaf_pos[1].y = lerp_def(prev->leaf_pos[1].y, curr->leaf_pos[1].y, blend); break; case IKT_1: if (curr->block_id == BLK_CL_MUNE) { @@ -12438,7 +12422,7 @@ void MotionBlendCombine::Step(struc_400* a2) { trans_xz = a2->field_0; trans_y = true; if (enable) - mat4_rotate_y(-a2->prev_rot_y, &rot_y_mat); + mat4_rotate_y(-a2->move_yang_bef, &rot_y_mat); else rot_y_mat = mat4_identity; } @@ -12514,9 +12498,9 @@ void MotionBlendFreeze::Step(struc_400* a2) { if (enable) { mat4 mat; if (field_24) - mat4_rotate_y(a2->rot_y, &mat); + mat4_rotate_y(a2->move_yang, &mat); else - mat4_rotate_y(-a2->prev_rot_y, &mat); + mat4_rotate_y(-a2->move_yang_bef, &mat); rot_y_mat = mat; } else @@ -12560,16 +12544,16 @@ void MotionBlendFreeze::Blend(RobBlock* curr, RobBlock* prev) { break; case IKT_0N: case IKT_0T: - curr->leaf_pos[0] = vec3::lerp(curr->smooth_pos[field_24], curr->leaf_pos[0], blend); + curr->leaf_pos[1] = vec3::lerp(curr->smooth_pos[field_24], curr->leaf_pos[1], blend); break; case IKT_ROOT: if (trans_xz) { - curr->leaf_pos[0].x = lerp_def(curr->smooth_pos[field_24].x, curr->leaf_pos[0].x, blend); - curr->leaf_pos[0].z = lerp_def(curr->smooth_pos[field_24].z, curr->leaf_pos[0].z, blend); + curr->leaf_pos[1].x = lerp_def(curr->smooth_pos[field_24].x, curr->leaf_pos[1].x, blend); + curr->leaf_pos[1].z = lerp_def(curr->smooth_pos[field_24].z, curr->leaf_pos[1].z, blend); } if (trans_y) - curr->leaf_pos[0].y = lerp_def(curr->smooth_pos[field_24].y, curr->leaf_pos[0].y, blend); + curr->leaf_pos[1].y = lerp_def(curr->smooth_pos[field_24].y, curr->leaf_pos[1].y, blend); break; case IKT_1: if (curr->block_id == BLK_CL_MUNE) { @@ -12648,22 +12632,28 @@ void PartialMotionBlendFreeze::Blend(RobBlock* curr, RobBlock* prev) { break; case IKT_0T: case IKT_0N: - curr->leaf_pos[0] = vec3::lerp(curr->smooth_pos[0], curr->leaf_pos[0], blend); + curr->leaf_pos[1] = vec3::lerp(curr->smooth_pos[0], curr->leaf_pos[1], blend); break; case IKT_ROOT: mat4_lerp_rotation(&curr->smooth_rot[0][0], &curr->chain_rot[0], &curr->chain_rot[0], blend); - curr->leaf_pos[0] = vec3::lerp(curr->smooth_pos[0], curr->leaf_pos[0], blend); + curr->leaf_pos[1] = vec3::lerp(curr->smooth_pos[0], curr->leaf_pos[1], blend); break; - case IKT_2: - case IKT_2R: - mat4_lerp_rotation(&curr->smooth_rot[2][0], &curr->chain_rot[2], &curr->chain_rot[2], blend); - case IKT_1: { + case IKT_1: mat4_mul(&curr->smooth_rot[1][0], &curr->smooth_rot[0][0], &prev_mat); mat4_mul(&curr->chain_rot[1], &curr->chain_rot[0], &mat); mat4_lerp_rotation(&prev_mat, &mat, &mat, blend); mat4_transpose(&curr->chain_rot[0], &ik_mat); mat4_mul(&mat, &ik_mat, &curr->chain_rot[1]); - } break; + break; + case IKT_2: + case IKT_2R: + mat4_lerp_rotation(&curr->smooth_rot[2][0], &curr->chain_rot[2], &curr->chain_rot[2], blend); + mat4_mul(&curr->smooth_rot[1][0], &curr->smooth_rot[0][0], &prev_mat); + mat4_mul(&curr->chain_rot[1], &curr->chain_rot[0], &mat); + mat4_lerp_rotation(&prev_mat, &mat, &mat, blend); + mat4_transpose(&curr->chain_rot[0], &ik_mat); + mat4_mul(&mat, &ik_mat, &curr->chain_rot[1]); + break; } } @@ -12677,13 +12667,13 @@ motion_blend_mot_enabled_bones::~motion_blend_mot_enabled_bones() { // 0x1404146F0 void motion_blend_mot_enabled_bones::check() { - int32_t bone_index = BLK_N_HARA_CP; + int32_t blk = BLK_N_HARA_CP; for (auto i = arr.begin(); i != arr.end(); i++) { - if (func((BONE_BLK)bone_index)) + if (func((BONE_BLK)blk)) *i = true; else *i = false; - bone_index++; + blk++; } } @@ -12708,11 +12698,11 @@ void motion_blend_mot_enabled_bones::set(void(*func)(prj::sys_vector&)) { } motion_blend_mot::motion_blend_mot() : bone_data(), -mot_key_data(), mot_play_data(), field_4F8(), field_5CC(), blend() { +mot_key_data(), mot_play_data(), smooth(), field_5CC(), blend() { mot_key_data.reset(); mot_play_data.reset(); - field_4F8.field_C0 = 1.0f; - field_4F8.field_C4 = 1.0f; + smooth.field_C0 = 1.0f; + smooth.field_C4 = 1.0f; } motion_blend_mot::~motion_blend_mot() { @@ -12722,37 +12712,37 @@ motion_blend_mot::~motion_blend_mot() { // 0x140415430 void motion_blend_mot::apply_global_transform() { mat4 mat; - mat4_rotate_y(bone_data.rot_y, &mat); + mat4_rotate_y(bone_data.yrot, &mat); mat4_mul_translate(&mat, &bone_data.gblctr_pos, &mat); mat4_mul_rotate_zyx(&mat, &bone_data.gblctr_rot, &mat); - for (RobBlock& i : bone_data.bones) + for (RobBlock& i : bone_data.block_vec) switch (i.ik_type) { case IKT_0N: - mat4_transform_point(&mat, &i.leaf_pos[0], &i.leaf_pos[0]); + mat4_transform_point(&mat, &i.leaf_pos[1], &i.leaf_pos[1]); break; case IKT_ROOT: { mat4 chain_rot; mat4_clear_trans(&mat, &chain_rot); i.chain_rot[0] = chain_rot; - mat4_transform_point(&mat, &i.leaf_pos[0], &i.leaf_pos[0]); + mat4_transform_point(&mat, &i.leaf_pos[1], &i.leaf_pos[1]); } break; case IKT_1: case IKT_2: case IKT_2R: - mat4_transform_point(&mat, &i.leaf_pos[1], &i.leaf_pos[1]); + mat4_transform_point(&mat, &i.leaf_pos[0], &i.leaf_pos[0]); break; } } void motion_blend_mot::copy_rot_trans() { - copy_rot_trans(bone_data.bones); + copy_rot_trans(bone_data.block_vec); } // 0x140412BB0 -void motion_blend_mot::copy_rot_trans(const prj::sys_vector& bones) { - for (RobBlock& i : bone_data.bones) - i.copy_rot_trans(bones[i.block_id]); +void motion_blend_mot::copy_rot_trans(const prj::sys_vector& block_vec) { + for (RobBlock& i : bone_data.block_vec) + i.copy_rot_trans(block_vec[i.block_id]); } bool motion_blend_mot::get_blend_enable() { @@ -12763,7 +12753,7 @@ bool motion_blend_mot::get_blend_enable() { // 0x140412DA0 void motion_blend_mot::get_n_hara_cp_position(vec3& position) { - position = bone_data.bones[BLK_N_HARA_CP].leaf_pos[0]; + position = bone_data.block_vec[BLK_N_HARA_CP].leaf_pos[1]; } MotionBlendType motion_blend_mot::get_type() { @@ -12781,31 +12771,31 @@ void motion_blend_mot::init(rob_chara_bone_data* rob_bone_data, bone_data_parent_data_init(&this->bone_data, rob_bone_data, bone_data); mot_key_data_init_key_sets( &mot_key_data, - this->bone_data.rob_bone_data->base_skeleton_type, - this->bone_data.motion_bone_count, - this->bone_data.leaf_pos); - enabled_bones.init(check_func, this->bone_data.motion_bone_count); + this->bone_data.rob_bone_data->kind, + this->bone_data.block_max, + this->bone_data.leaf_pos_max); + enabled_bones.init(check_func, this->bone_data.block_max); } void motion_blend_mot::interpolate() { const vec3* fc_value = (const vec3*)mot_key_data.fc_value.data(); - bool flip = motion_blend_mot::interpolate_get_flip(field_4F8); + bool flip = motion_blend_mot::interpolate_get_flip(smooth); float_t frame = mot_play_data.frame_data.frame; - BONE_KIND skeleton_type = bone_data.rob_bone_data->base_skeleton_type; - RobBlock* bones_data = bone_data.bones.data(); + BONE_KIND kind = bone_data.rob_bone_data->kind; + RobBlock* block_top = bone_data.block_vec.data(); for (uint16_t& i : bone_data.bone_indices) { - RobBlock* data = &bones_data[i]; - bool get_data = enabled_bones.arr[data->block_id]; - if (flip && data->flip_block_id != 0xFF) - data = &bones_data[data->flip_block_id]; + RobBlock* bl = &block_top[i]; + bool get_data = enabled_bones.arr[bl->block_id]; + if (flip && bl->flip_block_id != 0xFF) + bl = &block_top[bl->flip_block_id]; - if (get_data && frame != data->frame) { - mot_key_data.interpolate(frame, data->key_set_offset, data->key_set_count); - data->frame = frame; + if (get_data && frame != bl->frame) { + mot_key_data.interpolate(frame, bl->key_set_offset, bl->key_set_count); + bl->frame = frame; } - fc_value = data->set_global_leaf_sub(fc_value, skeleton_type, get_data, flip); + fc_value = bl->set_global_leaf_sub(fc_value, kind, get_data, flip); } uint32_t bone_key_set_count = bone_data.bone_key_set_count; @@ -12821,14 +12811,14 @@ void motion_blend_mot::interpolate() { apply_global_transform(); } -void motion_blend_mot::load_file(uint32_t motion_id, MotionBlendType blend_type, float_t blend, +void motion_blend_mot::load_file(uint32_t motnum, MotionBlendType blend_type, float_t blend, const bone_database* bone_data, const motion_database* mot_db) { set_blend(blend_type, blend); - const mot_data* v6 = mot_key_data_load_file(&mot_key_data, motion_id, mot_db); + const mot_data* v6 = mot_key_data_load_file(&mot_key_data, motnum, mot_db); bone_data_parent* v7 = &this->bone_data; if (v6) { bone_data_parent_load_bone_indices_from_mot(v7, v6, bone_data, mot_db); - RobBlock* bone = this->bone_data.bones.data(); + RobBlock* bone = this->bone_data.block_vec.data(); for (uint16_t& i : this->bone_data.bone_indices) bone[i].frame = -1.0f; } @@ -12837,42 +12827,26 @@ void motion_blend_mot::load_file(uint32_t motion_id, MotionBlendType blend_type, this->bone_data.bone_indices.clear(); } - field_4F8.field_8C = false; - field_4F8.field_4C = field_4F8.mat; - field_4F8.mat = mat4_identity; + sub_140413EB0(&smooth); } void motion_blend_mot::mult_mat(const mat4* mat) { - sub_140414900(&field_4F8, mat); + sub_140414900(&smooth, mat); - mat4& m = field_4F8.mat; - RobBlock* bones = bone_data.bones.data(); - for (RobBlock& bone : bone_data.bones) - bone.mult_mat(m, bones, true); + mat4& base_mtx = smooth.base_mtx; + RobBlock* bones = bone_data.block_vec.data(); + for (RobBlock& bone : bone_data.block_vec) + bone.recalc_fk_block(base_mtx, bones, true); } void motion_blend_mot::reset() { mot_key_data.reset(); mot_play_data.reset(); - field_4F8.field_0 = 0; - field_4F8.field_8 = 0; - field_4F8.mat = mat4_identity; - field_4F8.field_4C = mat4_identity; - field_4F8.field_8C = false; - field_4F8.rot_y = 0.0f; - field_4F8.prev_rot_y = 0.0f; - field_4F8.field_90 = 1.0f; - field_4F8.field_9C = 1.0f; - field_4F8.field_A8 = 1.0f; - field_4F8.field_BC = 0; - field_4F8.field_BD = 0; - field_4F8.field_C0 = 1.0f; - field_4F8.field_C4 = 1.0f; - field_4F8.field_C8 = 0.0f; + smooth.reset(); } -inline void motion_blend_mot::set_arm_length(BONE_BLK block_id, float_t value) { - bone_data.bones.data()[block_id].arm_length = value; +inline void motion_blend_mot::set_arm_length(BONE_BLK blk, float_t value) { + bone_data.block_vec[blk].arm_length = value; } void motion_blend_mot::set_blend(MotionBlendType blend_type, float_t blend) { @@ -12884,7 +12858,7 @@ void motion_blend_mot::set_blend(MotionBlendType blend_type, float_t blend) { case MOTION_BLEND_FREEZE: freeze.Reset(); this->blend = &freeze; - store_curr_rot_trans(0); + get_smooth_target(0); break; case MOTION_BLEND_CROSS: cross.Reset(); @@ -12912,24 +12886,24 @@ void motion_blend_mot::set_step(float_t step) { } // 0x140412E10 -void motion_blend_mot::store_curr_rot_trans(int32_t skeleton_select) { - for (RobBlock& i : bone_data.bones) +void motion_blend_mot::get_smooth_target(int32_t target) { + for (RobBlock& i : bone_data.block_vec) if (enabled_bones.arr[i.block_id]) { - i.store_curr_rot_trans(skeleton_select); - if (i.ik_type == IKT_ROOT && (field_4F8.field_0 & 0x02)) - i.smooth_pos[skeleton_select] += field_4F8.field_90; + i.get_smooth_target(target); + if (i.ik_type == IKT_ROOT && (smooth.field_0 & 0x02)) + i.smooth_pos[target] += smooth.field_90; } } -bool motion_blend_mot::interpolate_get_flip(struc_308& a1) { +bool motion_blend_mot::interpolate_get_flip(MotionSmooth& a1) { return a1.field_0 & 0x01 && !(a1.field_0 & 0x08) || !(a1.field_0 & 0x01) && a1.field_0 & 0x08; } -rob_chara_bone_data_ik_scale::rob_chara_bone_data_ik_scale() { - ratio0 = 1.0f; - ratio1 = 1.0f; - ratio2 = 1.0f; - ratio3 = 1.0f; +rob_chara_bone_data_adjust_scale::rob_chara_bone_data_adjust_scale() { + base = 1.0f; + body = 1.0f; + arm = 1.0f; + height = 1.0f; } partial_motion_blend_mot::partial_motion_blend_mot() : disable(), mot_key_data(), mot_play_data() { @@ -12940,32 +12914,32 @@ partial_motion_blend_mot::~partial_motion_blend_mot() { } -void partial_motion_blend_mot::init(BONE_KIND type, - PFNMOTIONBONECHECKFUNC check_func, size_t motion_bone_count, const bone_database* bone_data) { - mot_key_data_init(&mot_key_data, type, bone_data); - enabled_bones.init(check_func, motion_bone_count); +void partial_motion_blend_mot::init(BONE_KIND kind, PFNMOTIONBONECHECKFUNC check_func, + size_t block_max, const bone_database* bone_data) { + mot_key_data_init(&mot_key_data, kind, bone_data); + enabled_bones.init(check_func, block_max); } -void partial_motion_blend_mot::interpolate(prj::sys_vector& bones, - const prj::sys_vector* bone_indices, BONE_KIND skeleton_type) { +void partial_motion_blend_mot::interpolate(prj::sys_vector& block_vec, + const prj::sys_vector* bone_indices, BONE_KIND kind) { if (!mot_key_data.key_sets_ready || !mot_key_data.mot_data || disable) return; float_t frame = mot_play_data.frame_data.frame; const vec3* fc_value = (const vec3*)mot_key_data.fc_value.data(); for (const uint16_t& i : *bone_indices) { - RobBlock* data = &bones[i]; - bool get_data = enabled_bones.arr[data->block_id]; + RobBlock* block = &block_vec[i]; + bool get_data = enabled_bones.arr[block->block_id]; if (get_data) { - mot_key_data.interpolate(frame, data->key_set_offset, data->key_set_count); - data->frame = frame; + mot_key_data.interpolate(frame, block->key_set_offset, block->key_set_count); + block->frame = frame; } - fc_value = data->set_global_leaf_sub(fc_value, skeleton_type, get_data, false); + fc_value = block->set_global_leaf_sub(fc_value, kind, get_data, false); } } -void partial_motion_blend_mot::load_motion(uint32_t motion_id, const motion_database* mot_db) { - mot_key_data_load_file(&mot_key_data, motion_id, mot_db); +void partial_motion_blend_mot::load_file(uint32_t motnum, const motion_database* mot_db) { + mot_key_data_load_file(&mot_key_data, motnum, mot_db); blend.Reset(); } @@ -12983,10 +12957,10 @@ void partial_motion_blend_mot::set_step(float_t step) { } // 0x140412F20 -void partial_motion_blend_mot::store_curr_rot_trans(prj::sys_vector& bones) { - for (RobBlock& i : bones) +void partial_motion_blend_mot::get_smooth_target(prj::sys_vector& block_vec) { + for (RobBlock& i : block_vec) if (enabled_bones.arr[i.block_id]) - i.store_curr_rot_trans(0); + i.get_smooth_target(0); } void partial_motion_blend_mot::reset() { @@ -13026,16 +13000,26 @@ void rob_chara_look_anim_eye_param::reset() { xrot_adjust_clear_pos = 6.0f; } -struc_936::struc_936() { +Motion::AshiOidashi::AshiOidashi() : y_bef(), y_old(), scale() { } -void struc_936::reset() { - toe_l = 0.0f; - toe_r = 0.0f; +void Motion::AshiOidashi::reset() { + y_bef = 0.0f; + y_old = 0.0f; + scale = 0.0f; } -rob_chara_look_anim::rob_chara_look_anim() : bones(), update_view_point(), init_head_rotation(), +Motion::AshiOidashiColle::AshiOidashiColle() { + +} + +void Motion::AshiOidashiColle::reset() { + l.reset(); + r.reset(); +} + +rob_chara_look_anim::rob_chara_look_anim() : block_vec(), update_view_point(), init_head_rotation(), head_rotation(), init_eyes_rotation(), eyes_rotation(), disable(), head_rot_strength(), eyes_rot_strength(), eyes_rot_step(), duration(), eyes_rot_frame(), step(), head_rot_frame(), field_B0(), ext_head_rotation(), ext_head_rot_strength(), ext_head_rot_y_angle(), ext_head_rot_x_angle(), @@ -13045,7 +13029,7 @@ field_19C(), field_1AC(), eyes_xrot_adjust_neg(), eyes_xrot_adjust_pos(), ft(), } void rob_chara_look_anim::reset() { - bones = 0; + block_vec = 0; mat = mat4_identity; param.reset(); update_view_point = false; @@ -13118,8 +13102,8 @@ void rob_chara_look_anim::set_target_view_point(const vec3& value) { target_view_point = value; } -rob_chara_sleeve_adjust::rob_chara_sleeve_adjust() : sleeve_l(), sleeve_r(), -enable1(), enable2(), field_5C(), field_68(), field_74(), field_80(), radius(), bones(), step() { +rob_chara_sleeve_adjust::rob_chara_sleeve_adjust() : sleeve_l(), sleeve_r(), enable1(), enable2(), +field_5C(), field_68(), field_74(), field_80(), radius(), block_vec(), step() { reset(); } @@ -13129,7 +13113,7 @@ void rob_chara_sleeve_adjust::reset() { enable1 = false; enable2 = false; radius = 1.0f; - bones = 0; + block_vec = 0; step = 1.0f; field_5C = 0.0f; field_68 = 0.0f; @@ -13137,10 +13121,10 @@ void rob_chara_sleeve_adjust::reset() { field_80 = 0.0f; } -rob_chara_bone_data::rob_chara_bone_data() : field_0(), field_1(), object_bone_count(), node_count(), -motion_bone_count(), leaf_pos(), chain_pos(), disable_eye_motion(), look_anim() { - base_skeleton_type = BONE_KIND_NONE; - skeleton_type = BONE_KIND_NONE; +rob_chara_bone_data::rob_chara_bone_data() : field_0(), field_1(), mat_max(), node_max(), +block_max(), leaf_pos_max(), chain_pos_max(), disable_eye_motion(), look_anim() { + kind = BONE_KIND_NONE; + disp_kind = BONE_KIND_NONE; } rob_chara_bone_data::~rob_chara_bone_data() { @@ -13162,12 +13146,12 @@ bool rob_chara_bone_data::check_look_anim_ext_head_rotation() { return false; } -float_t rob_chara_bone_data::get_frame() { +float_t rob_chara_bone_data::get_frame() const { return motion_loaded.front()->mot_play_data.frame_data.frame; } -float_t rob_chara_bone_data::get_frame_count() { - return (float_t)motion_loaded.front()->mot_key_data.mot.frame_count; +float_t rob_chara_bone_data::get_frame_max() const { + return (float_t)motion_loaded.front()->mot_key_data.mot.frame_max; } vec3* rob_chara_bone_data::get_look_anim_target_view_point() { @@ -13190,8 +13174,8 @@ bool rob_chara_bone_data::get_look_anim_update_view_point() { } mat4* rob_chara_bone_data::get_mats_mat(size_t index) { - if (index < mats.size()) - return &mats[index]; + if (index < mat_vec.size()) + return &mat_vec[index]; return 0; } @@ -13209,50 +13193,50 @@ void rob_chara_bone_data::interpolate() { for (motion_blend_mot*& i : motion_loaded) i->interpolate(); - BONE_KIND skeleton_type = base_skeleton_type; + BONE_KIND kind = this->kind; motion_blend_mot* v5 = motion_loaded.front(); - prj::sys_vector& bones = v5->bone_data.bones; + prj::sys_vector& block_vec = v5->bone_data.block_vec; prj::sys_vector* bone_indices = &v5->bone_data.bone_indices; - face.interpolate(bones, bone_indices, skeleton_type); - hand_l.interpolate(bones, bone_indices, skeleton_type); - hand_r.interpolate(bones, bone_indices, skeleton_type); - mouth.interpolate(bones, bone_indices, skeleton_type); - eyes.interpolate(bones, bone_indices, skeleton_type); - eyelid.interpolate(bones, bone_indices, skeleton_type); + face.interpolate(block_vec, bone_indices, kind); + hand_l.interpolate(block_vec, bone_indices, kind); + hand_r.interpolate(block_vec, bone_indices, kind); + mouth.interpolate(block_vec, bone_indices, kind); + eyes.interpolate(block_vec, bone_indices, kind); + eyelid.interpolate(block_vec, bone_indices, kind); } -void rob_chara_bone_data::load_eyelid_motion(uint32_t motion_id, const motion_database* mot_db) { +void rob_chara_bone_data::load_eyelid_motion(uint32_t motnum, const motion_database* mot_db) { sub_14041AD50(this); - eyelid.store_curr_rot_trans(motion_loaded.front()->bone_data.bones); + eyelid.get_smooth_target(motion_loaded.front()->bone_data.block_vec); eyelid.enabled_bones.check(); - eyelid.load_motion(motion_id, mot_db); + eyelid.load_file(motnum, mot_db); } -void rob_chara_bone_data::load_eyes_motion(uint32_t motion_id, const motion_database* mot_db) { - eyes.store_curr_rot_trans(motion_loaded.front()->bone_data.bones); - eyes.load_motion(motion_id, mot_db); +void rob_chara_bone_data::load_eyes_motion(uint32_t motnum, const motion_database* mot_db) { + eyes.get_smooth_target(motion_loaded.front()->bone_data.block_vec); + eyes.load_file(motnum, mot_db); } -void rob_chara_bone_data::load_face_motion(uint32_t motion_id, const motion_database* mot_db) { +void rob_chara_bone_data::load_face_motion(uint32_t motnum, const motion_database* mot_db) { sub_14041AD90(this); - face.store_curr_rot_trans(motion_loaded.front()->bone_data.bones); + face.get_smooth_target(motion_loaded.front()->bone_data.block_vec); face.enabled_bones.check(); - face.load_motion(motion_id, mot_db); + face.load_file(motnum, mot_db); } -void rob_chara_bone_data::load_hand_l_motion(uint32_t motion_id, const motion_database* mot_db) { - hand_l.store_curr_rot_trans(motion_loaded.front()->bone_data.bones); - hand_l.load_motion(motion_id, mot_db); +void rob_chara_bone_data::load_hand_l_motion(uint32_t motnum, const motion_database* mot_db) { + hand_l.get_smooth_target(motion_loaded.front()->bone_data.block_vec); + hand_l.load_file(motnum, mot_db); } -void rob_chara_bone_data::load_hand_r_motion(uint32_t motion_id, const motion_database* mot_db) { - hand_r.store_curr_rot_trans(motion_loaded.front()->bone_data.bones); - hand_r.load_motion(motion_id, mot_db); +void rob_chara_bone_data::load_hand_r_motion(uint32_t motnum, const motion_database* mot_db) { + hand_r.get_smooth_target(motion_loaded.front()->bone_data.block_vec); + hand_r.load_file(motnum, mot_db); } -void rob_chara_bone_data::load_mouth_motion(uint32_t motion_id, const motion_database* mot_db) { - mouth.store_curr_rot_trans(motion_loaded.front()->bone_data.bones); - mouth.load_motion(motion_id, mot_db); +void rob_chara_bone_data::load_mouth_motion(uint32_t motnum, const motion_database* mot_db) { + mouth.get_smooth_target(motion_loaded.front()->bone_data.block_vec); + mouth.load_file(motnum, mot_db); } // 0x1404156B0 @@ -13272,7 +13256,7 @@ static void mot_play_data_step(mot_play_data* play_data) { switch (frame_data->loop_state) { case MOT_PLAY_FRAME_DATA_LOOP_ONCE: default: - frame_data->frame = min_def(frame_data->frame, frame_data->frame_count); + frame_data->frame = min_def(frame_data->frame, frame_data->frame_max); break; case MOT_PLAY_FRAME_DATA_LOOP_CONTINUOUS: { if (frame_data->loop_end >= 0.0f && frame_data->loop_end <= last_frame) @@ -13415,16 +13399,16 @@ void rob_chara_bone_data::motion_step() { } void rob_chara_bone_data::reset() { - object_bone_count = 0; - motion_bone_count = 0; - node_count = 0; - leaf_pos = 0; - chain_pos = 0; - mats.clear(); - mats2.clear(); - nodes.clear(); - base_skeleton_type = BONE_KIND_NONE; - skeleton_type = BONE_KIND_NONE; + mat_max = 0; + block_max = 0; + node_max = 0; + leaf_pos_max = 0; + chain_pos_max = 0; + mat_vec.clear(); + mat2_vec.clear(); + node_vec.clear(); + kind = BONE_KIND_NONE; + disp_kind = BONE_KIND_NONE; if (motions.size() == 3) { rob_chara_bone_data_motion_blend_mot_list_free(this, 0); @@ -13444,8 +13428,8 @@ void rob_chara_bone_data::reset() { eyes.reset(); eyelid.reset(); disable_eye_motion = false; - ik_scale = rob_chara_bone_data_ik_scale(); - field_76C.reset(); + adjust_scale = rob_chara_bone_data_adjust_scale(); + ashi_oidashi.reset(); look_anim.reset(); sleeve_adjust.reset(); } @@ -13529,10 +13513,10 @@ void rob_chara_bone_data::set_look_anim_target_view_point(const vec3& value) { } void rob_chara_bone_data::set_mats_identity() { - for (mat4& i : mats) + for (mat4& i : mat_vec) i = mat4_identity; - for (mat4& i : mats2) + for (mat4& i : mat2_vec) i = mat4_identity; } @@ -13540,13 +13524,13 @@ void rob_chara_bone_data::set_motion_blend_duration(float_t duration, float_t st motion_loaded.front()->set_blend_duration(duration, step, offset); } -void rob_chara_bone_data::set_motion_frame(float_t frame, float_t step, float_t frame_count) { +void rob_chara_bone_data::set_motion_frame(float_t frame, float_t step, float_t frame_max) { mot_play_data* play_data = &motion_loaded.front()->mot_play_data; play_data->frame_data.frame = frame; play_data->frame_data.step_prev = play_data->frame_data.step; play_data->frame_data.step = step; - play_data->frame_data.frame_count = frame_count; - play_data->frame_data.last_frame = frame_count - 1.0f; + play_data->frame_data.frame_max = frame_max; + play_data->frame_data.last_frame = frame_max - 1.0f; play_data->frame_data.max_frame = -1.0f; play_data->frame_data.playback_state = MOT_PLAY_FRAME_DATA_PLAYBACK_NONE; play_data->frame_data.loop_state = MOT_PLAY_FRAME_DATA_LOOP_NONE; @@ -13598,7 +13582,7 @@ void rob_chara_bone_data::update(const mat4* mat) { for (motion_blend_mot*& i : motion_loaded) { sub_1404117F0(i); - sub_14040FBF0(i, ik_scale.ratio0); + sub_14040FBF0(i, adjust_scale.base); } sub_1404182B0(this); @@ -13607,24 +13591,29 @@ void rob_chara_bone_data::update(const mat4* mat) { motion_loaded.front()->mult_mat(mat); } -rob_chara_pv_data::rob_chara_pv_data() : type(), field_4(), field_5(), -field_6(), yang(), field_16(), sleeve_l(), sleeve_r(), field_70(), -motion_face_ids(), chara_size_index(), height_adjust(), item() { - reset(); +eyes_adjust::eyes_adjust() : xrot_adjust(), base_adjust() { + neg = -1.0f; + pos = -1.0f; } -void rob_chara_pv_data::reset() { - type = ROB_CHARA_TYPE_2; - field_4 = true; - field_5 = false; - field_6 = false; - field_8 = 0.0f; +RobInit::RobInit() : rob_type(), disp(), mirror(), +drank_reset(), energy(), sleeve_l(), sleeve_r(), field_70(), +face_mot_slot(), chara_size_index(), height_adjust(), item() { + init(); +} + +void RobInit::init() { + rob_type = ROB_TYPE_AUTH; + disp = true; + mirror = false; + drank_reset = false; + pos = 0.0f; yang = 0; - field_16 = 0xC9; + energy = 201; sleeve_l = {}; sleeve_r = {}; field_70 = 0; - for (uint32_t& i : motion_face_ids) + for (uint32_t& i : face_mot_slot) i = -1; chara_size_index = 1; height_adjust = false; @@ -13636,30 +13625,29 @@ RobSkinOfs::RobSkinOfs() : flag() { } -rob_chara_item_equip_object::rob_chara_item_equip_object() : index(), motion_matrix(), +RobSkinDisp::RobSkinDisp() : index(), motion_matrix(), obj_uid(), obj_uid_sub(), alpha(), obj_flags(), can_disp(), bone_kind(), mat(), init_cnt(), motion_node(), field_138(), osage_depends_on_others(), osage_nodes_count(), use_opd(), skin_ex_data(), skin(), rob_disp() { init_members(0x12345678); } -rob_chara_item_equip_object::~rob_chara_item_equip_object() { +RobSkinDisp::~RobSkinDisp() { init_members(0xDDDDDDDD); } -void rob_chara_item_equip_object::add_motion_reset_data( - uint32_t motion_id, float_t frame, int32_t iterations) { - if (iterations > 0) - pos_reset(iterations); +void RobSkinDisp::add_motion_reset_data(const uint32_t& motnum, const float_t& frame, int32_t init_cnt) { + if (init_cnt > 0) + pos_reset(init_cnt); for (ExOsageBlock*& i : osage_blk) - i->AddMotionResetData(motion_id, frame); + i->AddMotionResetData(motnum, frame); for (ExClothBlock*& i : cloth) - i->AddMotionResetData(motion_id, frame); + i->AddMotionResetData(motnum, frame); } -void rob_chara_item_equip_object::check_no_opd(std::vector& opd_blend_data) { +void RobSkinDisp::check_no_opd(std::vector& opd_blend_data) { use_opd = true; if (!osage_blk.size() && !cloth.size() || !opd_blend_data.size()) return; @@ -13667,7 +13655,7 @@ void rob_chara_item_equip_object::check_no_opd(std::vector& opd_ for (::opd_blend_data& i : opd_blend_data) { const float_t* opd_data = 0; uint32_t opd_count = 0; - osage_play_data_manager_get_opd_file_data(obj_uid, i.motion_id, opd_data, opd_count); + osage_play_data_manager_get_opd_file_data(obj_uid, i.motnum, opd_data, opd_count); if (!opd_data) { use_opd = false; break; @@ -13675,7 +13663,7 @@ void rob_chara_item_equip_object::check_no_opd(std::vector& opd_ } } -void rob_chara_item_equip_object::clear_ex_data() { +void RobSkinDisp::dest_ex_node() { for (ExNullBlock*& i : null_blk) { i->dest(); delete i; @@ -13709,7 +13697,7 @@ void rob_chara_item_equip_object::clear_ex_data() { ex_node_block.clear(); } -void rob_chara_item_equip_object::disp(const mat4& mat, render_context* rctx) { +void RobSkinDisp::disp(const mat4& mat, render_context* rctx) { if (obj_uid.is_null()) return; @@ -13730,7 +13718,7 @@ void rob_chara_item_equip_object::disp(const mat4& mat, render_context* rctx) { rctx->disp_manager->set_obj_flags(flags); } -int32_t rob_chara_item_equip_object::get_node_index(const char* name, const bone_database* bone_data) const { +int32_t RobSkinDisp::get_node_index(const char* name, const bone_database* bone_data) const { int32_t node_index = bone_data->get_bone_node_index(BONE_KIND_CMN, name); if (node_index == -1) for (auto& i : node_name_map) @@ -13739,7 +13727,7 @@ int32_t rob_chara_item_equip_object::get_node_index(const char* name, const bone return node_index; } -const RobNode* rob_chara_item_equip_object::get_node(int32_t index) const { +const RobNode* RobSkinDisp::get_node(int32_t index) const { if (!(index & 0x8000)) return &motion_node[index & 0x7FFF]; else if ((index & 0x7FFF) < ex_node.size()) @@ -13747,11 +13735,11 @@ const RobNode* rob_chara_item_equip_object::get_node(int32_t index) const { return 0; } -const RobNode* rob_chara_item_equip_object::get_node(const char* name, const bone_database* bone_data) const { +const RobNode* RobSkinDisp::get_node(const char* name, const bone_database* bone_data) const { return get_node(get_node_index(name, bone_data)); } -const mat4* rob_chara_item_equip_object::get_ex_data_bone_node_mat(const char* name) { +const mat4* RobSkinDisp::get_ex_data_bone_node_mat(const char* name) { if (!name || !ex_node.size()) return &mat4_identity; @@ -13762,7 +13750,7 @@ const mat4* rob_chara_item_equip_object::get_ex_data_bone_node_mat(const char* n return &mat4_identity; } -RobJointNode* rob_chara_item_equip_object::get_normal_ref_osage_node(const std::string& str, size_t* index) { +RobJointNode* RobSkinDisp::get_normal_ref_osage_node(const std::string& str, size_t* index) { if (!str.size()) return 0; @@ -13786,14 +13774,7 @@ RobJointNode* rob_chara_item_equip_object::get_normal_ref_osage_node(const std:: return node; } -void rob_chara_item_equip_object::set_motion_node(const RobNode* mot_node, const bone_database* bone_data) { - motion_node = mot_node; - motion_matrix = mot_node->mat_ptr; - for (ExNodeBlock*& i : ex_node_block) - i->parent = get_node(i->parent_name.c_str(), bone_data); -} - -void rob_chara_item_equip_object::init_members(size_t index) { +void RobSkinDisp::init_members(size_t index) { this->index = index; obj_uid = {}; obj_uid_sub = {}; @@ -13811,7 +13792,7 @@ void rob_chara_item_equip_object::init_members(size_t index) { bone_kind = 0; mat = 0; motion_node = 0; - clear_ex_data(); + dest_ex_node(); ex_node.clear(); matrix.clear(); no_scale_matrix.clear(); @@ -13821,15 +13802,8 @@ void rob_chara_item_equip_object::init_members(size_t index) { osage_nodes_count = 0; } -void rob_chara_item_equip::load_outfit_object_info(ROB_PARTS_KIND rpk, object_info obj_info, - bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db) { - if (rpk < RPK_BASE_BEGIN && rpk > RPK_BASE_END) - obj_info = {}; - set_item(obj_info, rpk, osage_reset, bone_data, data, obj_db); -} - // 0x1405F4820 -void rob_chara_item_equip_object::pos_reset(int32_t init_cnt) { +void RobSkinDisp::pos_reset(int32_t init_cnt) { if (!ex_node_block.size()) return; @@ -13841,21 +13815,21 @@ void rob_chara_item_equip_object::pos_reset(int32_t init_cnt) { for (; init_cnt; init_cnt--) { if (osage_depends_on_others) - rob_chara_item_equip_object_ctrl_step(this, true); + RobSkinDisp_ctrl_step(this, true); for (ExNodeBlock*& i : ex_node_block) (i->*pos_init_cont)(); } } -void rob_chara_item_equip_object::reset_ex_force() { +void RobSkinDisp::reset_ex_force() { for (ExOsageBlock*& i : osage_blk) i->reset_ex_force(); for (ExClothBlock*& i : cloth) i->reset_ex_force(); } -void rob_chara_item_equip_object::reset_nodes_ex_force(rob_osage_parts_bit parts_bits) { +void RobSkinDisp::reset_nodes_ex_force(rob_osage_parts_bit parts_bits) { for (ExOsageBlock*& i : osage_blk) if (i->osage_work.CheckPartsBits(parts_bits)) { i->osage_work.SetNodesExternalForce(0, 1.0f); @@ -13863,7 +13837,7 @@ void rob_chara_item_equip_object::reset_nodes_ex_force(rob_osage_parts_bit parts } } -void rob_chara_item_equip_object::set(object_info objuid, const RobNode* mot_node, +void RobSkinDisp::set(object_info objuid, const RobNode* mot_node, bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db) { obj_uid = objuid; motion_node = mot_node; @@ -13871,7 +13845,7 @@ void rob_chara_item_equip_object::set(object_info objuid, const RobNode* mot_nod ex_node.clear(); node_name_map.clear(); matrix.clear(); - clear_ex_data(); + dest_ex_node(); obj_skin* skin = objset_info_storage_get_obj_skin(obj_uid); if (!skin) @@ -13889,12 +13863,12 @@ void rob_chara_item_equip_object::set(object_info objuid, const RobNode* mot_nod init_cnt = 60; } -void rob_chara_item_equip_object::set_alpha_obj_flags(float_t alpha, int32_t flags) { +void RobSkinDisp::set_alpha_obj_flags(float_t alpha, int32_t flags) { obj_flags = (mdl::ObjFlags)flags; this->alpha = clamp_def(alpha, 0.0f, 1.0f); } -bool rob_chara_item_equip_object::set_boc( +bool RobSkinDisp::set_boc( const skin_param_osage_root& skp_root, ExOsageBlock* osg) { RobOsage& osage_work = osg->osage_work; osage_work.dest_boc(); @@ -13916,7 +13890,24 @@ bool rob_chara_item_equip_object::set_boc( return has_boc_node; } -void rob_chara_item_equip_object::set_collision_target_osage( +// 0x1405F7240 +void RobSkinDisp::set_col_color(const vec3& blend, const vec3& ofs) { + skn_col.blend_color = blend; + skn_col.offset_color = ofs; +} + +// 0x1405F7240 +void RobSkinDisp::set_col_specular(const vec3& blend, const vec3& ofs) { + skn_col.blend_specular = blend; + skn_col.offset_specular = ofs; +} + +// 0x1405F7270 +void RobSkinDisp::set_col_type(int32_t type) { + skn_col.type = type; +} + +void RobSkinDisp::set_collision_target_osage( const skin_param_osage_root& skp_root, skin_param* skp) { if (!skp_root.colli_tgt_osg.size()) return; @@ -13929,46 +13920,47 @@ void rob_chara_item_equip_object::set_collision_target_osage( } } -void rob_chara_item_equip_object::set_disable_collision(rob_osage_parts_bit parts_bits, bool disable) { +void RobSkinDisp::set_disable_collision(rob_osage_parts_bit parts_bits, bool disable) { for (ExOsageBlock*& i : osage_blk) if (i->osage_work.CheckPartsBits(parts_bits)) i->SetDisableCollision(disable); } -void rob_chara_item_equip_object::set_ex_node(obj_skin_ex_data* ex_data) { +void RobSkinDisp::set_ex_node(obj_skin_ex_data* ex_data) { + static size_t ex_node_least = 64; + ex_node.clear(); matrix.clear(); no_scale_matrix.clear(); - int32_t nb_node_name = ex_data->nb_node_name; - ex_node.resize(nb_node_name); - matrix.resize(nb_node_name); - no_scale_matrix.resize(nb_node_name); + ex_node.resize(max_def(ex_node_least, (size_t)ex_data->nb_node_name)); + matrix.resize(ex_node.size()); + no_scale_matrix.resize(ex_node.size()); RobNode* motion_node = ex_node.data(); mat4* mat = matrix.data(); mat4* no_scale_mat = no_scale_matrix.data(); - for (int32_t i = 0; i < nb_node_name; i++) + for (size_t i = 0; i < ex_node.size(); i++) motion_node[i].mat_ptr = &mat[i]; if (ex_data->ex_node_name) { node_name_map.clear(); const char** ex_node_name = ex_data->ex_node_name; - for (int32_t i = 0; i < nb_node_name; i++) { - motion_node[i].set_name_mat_no_scale_mat(ex_node_name[i], &mat[i], &no_scale_mat[i]); - node_name_map.push_back(ex_node_name[i], i); + for (size_t i = 0; i < ex_data->nb_node_name; i++) { + motion_node[i].init(ex_node_name[i], &mat[i], &no_scale_mat[i]); + node_name_map.push_back(ex_node_name[i], (uint32_t)i); } } } -void rob_chara_item_equip_object::set_ex_node_block(obj_skin_ex_data* ex_data, +void RobSkinDisp::set_ex_node_block(obj_skin_ex_data* ex_data, const bone_database* bone_data, void* data, const object_database* obj_db) { if (!ex_data->ex_node_table) return; - prj::vector_pair joint_node_list; - std::map ex_node_list; - clear_ex_data(); + prj::vector_pair joint_map; + std::map node_name_map; + dest_ex_node(); size_t constraint_count = 0; size_t expression_count = 0; @@ -13990,7 +13982,7 @@ void rob_chara_item_equip_object::set_ex_node_block(obj_skin_ex_data* ex_data, cloth.push_back(cls); cls->set_data(this, block->cloth, 0, bone_data); cls->block_idx = cloth_count + osage_count; - cls->name = block->cloth->omote_name; + cls->set_name(block->cloth->omote_name); cloth_count++; } break; case OBJ_SKIN_EX_NODE_CONSTRAINT: { @@ -14022,12 +14014,13 @@ void rob_chara_item_equip_object::set_ex_node_block(obj_skin_ex_data* ex_data, ExOsageBlock* osg = new ExOsageBlock; ex_node = osg; osage_blk.push_back(osg); - osg->set_data(this, block->osage, ex_node_name[block->osage->root_idx & 0x7FFF], + osg->set_data(this, block->osage, &skin_ex_data->osage_joint[block->osage->joint_ofs], motion_node, this->ex_node.data(), skin); - osg->get_node_list(block->osage, - &skin_ex_data->osage_joint[block->osage->joint_ofs], joint_node_list, ex_node_list); + osg->make_joint_map(block->osage, + &skin_ex_data->osage_joint[block->osage->joint_ofs], joint_map, node_name_map); osg->block_idx = osage_count; + osg->set_name(ex_node_name[block->osage->root_idx & 0x7FFF]); osage_count++; } break; default: { @@ -14059,12 +14052,12 @@ void rob_chara_item_equip_object::set_ex_node_block(obj_skin_ex_data* ex_data, } if (parent) { - auto elem = ex_node_list.find(parent->name); - if (elem != ex_node_list.end()) + auto elem = node_name_map.find(parent->name); + if (elem != node_name_map.end()) ex_node->parent_node = elem->second; } - ex_node_list.insert({ ex_node->name, ex_node }); + node_name_map.insert({ ex_node->name, ex_node }); ex_node_block.push_back(ex_node); } @@ -14108,17 +14101,17 @@ void rob_chara_item_equip_object::set_ex_node_block(obj_skin_ex_data* ex_data, uint32_t dst_joint = sibling_info->dst_joint; uint32_t src_joint = sibling_info->src_joint; - auto node_elem = joint_node_list.begin(); - for (; node_elem != joint_node_list.end(); node_elem++) + auto node_elem = joint_map.begin(); + for (; node_elem != joint_map.end(); node_elem++) if (node_elem->first == dst_joint) break; - auto distance_elem = joint_node_list.begin(); - for (; distance_elem != joint_node_list.end(); distance_elem++) + auto distance_elem = joint_map.begin(); + for (; distance_elem != joint_map.end(); distance_elem++) if (distance_elem->first == src_joint) break; - if (node_elem != joint_node_list.end() && distance_elem != joint_node_list.end()) { + if (node_elem != joint_map.end() && distance_elem != joint_map.end()) { RobJointNode* node = node_elem->second; node->distance = distance_elem->second; node->length_dist = sibling_info->length; @@ -14137,20 +14130,27 @@ void rob_chara_item_equip_object::set_ex_node_block(obj_skin_ex_data* ex_data, this->osage_nodes_count = osage_nodes_count; } -void rob_chara_item_equip_object::set_motion_reset_data(uint32_t motion_id, float_t frame) { - for (ExOsageBlock*& i : osage_blk) - i->SetMotionResetData(motion_id, frame); - - for (ExClothBlock*& i : cloth) - i->SetMotionResetData(motion_id, frame); +void RobSkinDisp::set_motion_node(const RobNode* mot_node, const bone_database* bone_data) { + motion_node = mot_node; + motion_matrix = mot_node->mat_ptr; + for (ExNodeBlock*& i : ex_node_block) + i->parent = get_node(i->parent_name.c_str(), bone_data); } -void rob_chara_item_equip_object::set_motion_skin_param(int8_t chara_id, uint32_t motion_id, int32_t frame) { +void RobSkinDisp::set_motion_reset_data(const uint32_t& motnum, const float_t& frame) { + for (ExOsageBlock*& i : osage_blk) + i->SetMotionResetData(motnum, frame); + + for (ExClothBlock*& i : cloth) + i->SetMotionResetData(motnum, frame); +} + +void RobSkinDisp::set_motion_skin_param(int8_t rob_id, uint32_t motnum, int32_t frame) { if (obj_uid.is_null()) return; std::vector* skp_file_data - = skin_param_manager_get_skin_param_file_data(chara_id, obj_uid, motion_id, frame); + = skin_param_manager_get_skin_param_file_data(rob_id, obj_uid, motnum, frame); if (!skp_file_data) return; @@ -14167,10 +14167,10 @@ void rob_chara_item_equip_object::set_motion_skin_param(int8_t chara_id, uint32_ } } -void rob_chara_item_equip_object::set_null_blocks_expression_data( - const vec3& position, const vec3& rotation, const vec3& scale) { - const vec3 pos = position; - const vec3 rot = rotation * DEG_TO_RAD_FLOAT; +// 0x1405F92D0 +void RobSkinDisp::set_ofs(const vec3& pos, const vec3& rot, const vec3& scale) { + const vec3 _pos = pos; + const vec3 _rot = rot * DEG_TO_RAD_FLOAT; const vec3 sc = scale; skn_ofs.flag = true; @@ -14179,13 +14179,13 @@ void rob_chara_item_equip_object::set_null_blocks_expression_data( continue; RobTransform& transform = i->dst_node->transform; - transform.pos = pos; - transform.rot = rot; + transform.pos = _pos; + transform.rot = _rot; transform.scale = sc; } } -void rob_chara_item_equip_object::set_osage_play_data_init(const float_t* opdi_data) { +void RobSkinDisp::set_osage_play_data_init(const float_t* opdi_data) { for (ExOsageBlock*& i : osage_blk) opdi_data = i->SetOsagePlayDataInit(opdi_data); @@ -14193,7 +14193,7 @@ void rob_chara_item_equip_object::set_osage_play_data_init(const float_t* opdi_d opdi_data = i->SetOsagePlayDataInit(opdi_data); } -void rob_chara_item_equip_object::set_osage_reset() { +void RobSkinDisp::set_osage_reset() { for (ExOsageBlock*& i : osage_blk) i->SetOsageReset(); @@ -14201,7 +14201,7 @@ void rob_chara_item_equip_object::set_osage_reset() { i->SetOsageReset(); } -void rob_chara_item_equip_object::set_osage_move_cancel(const float_t& mv_ccl) { +void RobSkinDisp::set_osage_move_cancel(const float_t& mv_ccl) { for (ExOsageBlock*& i : osage_blk) i->set_move_cancel(mv_ccl); @@ -14209,14 +14209,14 @@ void rob_chara_item_equip_object::set_osage_move_cancel(const float_t& mv_ccl) { i->set_move_cancel(mv_ccl); } -void rob_chara_item_equip_object::set_texture_pattern(texture_pattern_struct* tex_pat, size_t count) { +// 0x1405F9C30 +void RobSkinDisp::set_tex_change(size_t num, const TexChange* texchg) { texchg_vec.clear(); - if (count && tex_pat) - for (size_t i = 0; i < count; i++) - texchg_vec.push_back(tex_pat[i]); + if (num && texchg) + texchg_vec.insert(texchg_vec.end(), texchg, texchg + num); } -void rob_chara_item_equip_object::skp_load(void* kv, const bone_database* bone_data) { +void RobSkinDisp::skp_load(void* kv, const bone_database* bone_data) { key_val* _kv = (key_val*)kv; if (_kv->key.size() < 1) return; @@ -14238,7 +14238,7 @@ void rob_chara_item_equip_object::skp_load(void* kv, const bone_database* bone_d } } -void rob_chara_item_equip_object::skp_load(const skin_param_osage_root& skp_root, +void RobSkinDisp::skp_load(const skin_param_osage_root& skp_root, std::vector& vec, skin_param_file_data* skp_file_data, const bone_database* bone_data) { set_collision_target_osage(skp_root, &skp_file_data->skin_param); skp_file_data->depends_on_others |= skp_file_data->skin_param.coli_type > SkinParam::RootCollisionTypeEnd; @@ -14252,7 +14252,7 @@ void rob_chara_item_equip_object::skp_load(const skin_param_osage_root& skp_root skp_file_data->depends_on_others |= skp_load_normal_ref(skp_root, &skp_file_data->nodes_data); } -bool rob_chara_item_equip_object::skp_load_boc( +bool RobSkinDisp::skp_load_boc( const skin_param_osage_root& skp_root, std::vector* node_data) { bool has_boc_node = false; for (const skin_param_osage_root_boc& i : skp_root.boc) @@ -14271,7 +14271,7 @@ bool rob_chara_item_equip_object::skp_load_boc( return has_boc_node; } -void rob_chara_item_equip_object::skp_load_file(void* data, +void RobSkinDisp::skp_load_file(void* data, const bone_database* bone_data, const object_database* obj_db) { key_val* kv_ptr = skin_param_storage_get_key_val(obj_uid); if (kv_ptr) { @@ -14287,7 +14287,7 @@ void rob_chara_item_equip_object::skp_load_file(void* data, skp_load(&kv, bone_data); } -bool rob_chara_item_equip_object::skp_load_normal_ref( +bool RobSkinDisp::skp_load_normal_ref( const skin_param_osage_root& skp_root, std::vector* node_data) { if (!skp_root.normal_ref.size()) return false; @@ -14309,11 +14309,11 @@ bool rob_chara_item_equip_object::skp_load_normal_ref( return true; } -rob_chara_item_equip::rob_chara_item_equip() : motion_node(), motion_matrix(), skin_disp(), -parts_attr(), one_skin(), disp_begin(), disp_max(), shadow_flag(), shadow_group(), position(), -hyoutan_rpk(), disable_update(), field_DC(), skin_color(), wet(), wind_strength(), chara_color(), +RobDisp::RobDisp() : motion_node(), motion_matrix(), skin_disp(), parts_attr(), one_skin(), +disp_begin(), disp_max(), shadow_flag(), shadow_group(), position(), hyoutan_rpk(), +disable_update(), hyoutan_status(), skin_color(), wet_cloth(), wind_strength(), chara_color(), npr_flag(), shadow_skin(), use_opd(), parts_short(), parts_append(), parts_white_one_l() { - skin_disp = new rob_chara_item_equip_object[RPK_MAX]; + skin_disp = new RobSkinDisp[RPK_MAX]; wind_strength = 1.0f; chara_color = true; osage_step = 1.0f; @@ -14322,7 +14322,7 @@ npr_flag(), shadow_skin(), use_opd(), parts_short(), parts_append(), parts_white skin_disp[i].rob_disp = this; } -rob_chara_item_equip::~rob_chara_item_equip() { +RobDisp::~RobDisp() { reset(); if (skin_disp) { @@ -14331,23 +14331,23 @@ rob_chara_item_equip::~rob_chara_item_equip() { } } -void rob_chara_item_equip::add_motion_reset_data(uint32_t motion_id, float_t frame, int32_t iterations) { +void RobDisp::add_motion_reset_data(const uint32_t& motnum, const float_t& frame, int32_t init_cnt) { for (int32_t i = disp_begin; i < disp_max; i++) - skin_disp[i].add_motion_reset_data(motion_id, frame, iterations); + skin_disp[i].add_motion_reset_data(motnum, frame, init_cnt); } -static void sub_140512C20(rob_chara_item_equip* rob_disp, render_context* rctx) { - if (rob_disp->hyoutan_obj.is_null() || rob_disp->hyoutan_rpk == RPK_NONE) +static void sub_140512C20(RobDisp* disp, render_context* rctx) { + if (disp->hyoutan_obj.is_null() || disp->hyoutan_rpk == RPK_NONE) return; mat4 mat = mat4_identity; const char* name; - if (rob_disp->field_DC == 1) { + if (disp->hyoutan_status == HYOUTAN_STAT_RIGHT_HAND) { name = "kl_te_r_wj"; mat4_translate(0.0f, 0.0f, 0.082f, &mat); mat4_mul_rotate_zyx(&mat, (float_t)(-90.9 * DEG_TO_RAD), 0.0f, (float_t)(-179.5 * DEG_TO_RAD), &mat); } - if (rob_disp->field_DC == 2) { + if (disp->hyoutan_status == HYOUTAN_STAT_LEFT_HAND) { name = "kl_te_l_wj"; mat4_translate(0.0f, 0.0015f, -0.0812f, &mat); mat4_mul_rotate_zyx(&mat, (float_t)(-34.5 * DEG_TO_RAD), 0.0f, (float_t)(-179.5 * DEG_TO_RAD), &mat); @@ -14358,20 +14358,20 @@ static void sub_140512C20(rob_chara_item_equip* rob_disp, render_context* rctx) data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; - const RobNode* node = rob_disp->skin_disp[rob_disp->hyoutan_rpk].get_node(name, aft_bone_data); + const RobNode* node = disp->skin_disp[disp->hyoutan_rpk].get_node(name, aft_bone_data); if (!node || !node->mat_ptr) return; mat4_mul(node->mat_ptr, &mat, &mat); - int32_t num_texchg = (int32_t)rob_disp->hyoutan_texchg_list.size(); + int32_t num_texchg = (int32_t)disp->hyoutan_texchg_list.size(); if (num_texchg) - rctx->disp_manager->set_texture_pattern(num_texchg, rob_disp->hyoutan_texchg_list.data()); - rctx->disp_manager->entry_obj_by_object_info(mat, rob_disp->hyoutan_obj); + rctx->disp_manager->set_texture_pattern(num_texchg, disp->hyoutan_texchg_list.data()); + rctx->disp_manager->entry_obj_by_object_info(mat, disp->hyoutan_obj); if (num_texchg) rctx->disp_manager->set_texture_pattern(); } -void rob_chara_item_equip::disp(int32_t chara_id, render_context* rctx) { +void RobDisp::disp(int32_t rob_id, render_context* rctx) { extern bool reflect_full; extern bool reflect_draw; reflect_draw = reflect_full; @@ -14409,10 +14409,10 @@ void rob_chara_item_equip::disp(int32_t chara_id, render_context* rctx) { disp_manager.get_texture_color_coeff(temp_texture_color_coeff); disp_manager.set_texture_color_coefficients(skin_color); - disp_manager.set_wet_param(wet); + disp_manager.set_wet_param(wet_cloth); rctx->render_manager->npr_mask |= npr_flag; sub_140512C20(this, rctx); - rob_chara_age_age_array_disp(rctx, chara_id, rctx->chara_reflect, chara_color); + rob_chara_age_age_array_disp(rctx, rob_id, rctx->chara_reflect, chara_color); if (one_skin) for (int32_t i = disp_begin; i < disp_max; i++) @@ -14439,51 +14439,59 @@ void rob_chara_item_equip::disp(int32_t chara_id, render_context* rctx) { } } disp_manager.set_texture_color_coefficients(temp_texture_color_coeff); - disp_manager.set_wet_param(); - disp_manager.set_chara_color(); - disp_manager.set_obj_flags(); - disp_manager.set_shadow_group(); +disp_manager.set_wet_param(); +disp_manager.set_chara_color(); +disp_manager.set_obj_flags(); +disp_manager.set_shadow_group(); - reflect_draw = false; +reflect_draw = false; } -rob_chara_item_equip_object* rob_chara_item_equip::get_skin_disp(ROB_PARTS_KIND rpk) { - if (rpk >= 0 && rpk < RPK_MAX) - return &skin_disp[rpk]; - return 0; -} - -object_info rob_chara_item_equip::get_object_info(ROB_PARTS_KIND rpk) { +// 0x140513130 +object_info RobDisp::get_objid(ROB_PARTS_KIND rpk) const { if (rpk >= 0 && rpk < RPK_MAX) return skin_disp[rpk].obj_uid; return {}; } -void rob_chara_item_equip::set_motion_node(const RobNode* mot_node, const bone_database* bone_data) { - motion_node = mot_node; - motion_matrix = mot_node->no_scale_mat; - for (int32_t i = disp_begin; i < disp_max; i++) - skin_disp[i].set_motion_node(mot_node, bone_data); +// Added +RobSkinDisp* RobDisp::get_skin_work(ROB_PARTS_KIND rpk) { + if (rpk >= 0 && rpk < RPK_MAX) + return &skin_disp[rpk]; + return 0; } -const mat4* rob_chara_item_equip::get_ex_data_bone_node_mat(ROB_PARTS_KIND rpk, const char* name) { +// 0x140513210 +const RobSkinDisp* RobDisp::get_skin_work(ROB_PARTS_KIND rpk) const { + if (rpk >= 0 && rpk < RPK_MAX) + return &skin_disp[rpk]; + return 0; +} + +const mat4* RobDisp::get_ex_data_bone_node_mat(ROB_PARTS_KIND rpk, const char* name) { return skin_disp[rpk].get_ex_data_bone_node_mat(name); } -void rob_chara_item_equip::load_body_parts_object_info(ROB_PARTS_KIND rpk, object_info obj_info, - const bone_database* bone_data, void* data, const object_database* obj_db) { - if (rpk < RPK_ITEM_BEGIN || rpk > RPK_ITEM_END) - obj_info = {}; - set_item(obj_info, rpk, false, bone_data, data, obj_db); +// 0x140512EF0 +ROB_PARTS_KIND RobDisp::get_free_item(ROB_PARTS_KIND rpk) const { + int32_t _rpk = rpk; + if (rpk < 0 || rpk >= RPK_DISP_END) + return RPK_NONE; + + for (const RobSkinDisp* skin = &skin_disp[rpk]; skin->obj_uid.not_null(); skin++) { + if (++_rpk >= RPK_DISP_END) + return RPK_NONE; + } + return (ROB_PARTS_KIND)_rpk; } // 0x1405135E0 -void rob_chara_item_equip::pos_reset(uint8_t init_cnt) { +void RobDisp::pos_reset(uint8_t init_cnt) { for (int32_t i = 0; i < RPK_MAX; i++) skin_disp[i].pos_reset(init_cnt); } -void rob_chara_item_equip::reset() { +void RobDisp::reset() { motion_node = 0; motion_matrix = 0; for (int32_t i = 0; i < RPK_MAX; i++) @@ -14504,12 +14512,12 @@ void rob_chara_item_equip::reset() { disp_max = RPK_DISP_END; } -void rob_chara_item_equip::reset_ex_force() { +void RobDisp::reset_ex_force() { for (int32_t i = disp_begin; i < disp_max; i++) skin_disp[i].reset_ex_force(); } -void rob_chara_item_equip::reset_init_data(RobNode* mot_node) { +void RobDisp::reset_init_data(RobNode* mot_node) { reset(); motion_node = mot_node; motion_matrix = mot_node->mat_ptr; @@ -14523,19 +14531,19 @@ void rob_chara_item_equip::reset_init_data(RobNode* mot_node) { } osage_step = 1.0f; - wet = 0.0f; + wet_cloth = 0.0f; wind_strength = 1.0f; chara_color = true; npr_flag = false; mat = mat4_identity; } -void rob_chara_item_equip::reset_nodes_ex_force(rob_osage_parts parts) { +void RobDisp::reset_nodes_ex_force(rob_osage_parts parts) { skin_disp[parts == ROB_OSAGE_PARTS_MUFFLER ? RPK_OUTER : RPK_KAMI] .reset_nodes_ex_force((rob_osage_parts_bit)(1 << parts)); } -void rob_chara_item_equip::set_alpha_obj_flags(float_t alpha, mdl::ObjFlags flags) { +void RobDisp::set_alpha_obj_flags(float_t alpha, mdl::ObjFlags flags) { if (one_skin) for (int32_t i = disp_begin; i < disp_max; i++) skin_disp[i].set_alpha_obj_flags(alpha, flags); @@ -14544,47 +14552,105 @@ void rob_chara_item_equip::set_alpha_obj_flags(float_t alpha, mdl::ObjFlags flag skin_disp[i].set_alpha_obj_flags(alpha, flags); } -void rob_chara_item_equip::set_disable_collision(rob_osage_parts parts, bool disable) { +// 0x140513950 +void RobDisp::set_base(ROB_PARTS_KIND rpk, object_info obj_uid, bool osage_reset, + const bone_database* bone_data, void* data, const object_database* obj_db) { + if (rpk < RPK_BASE_BEGIN && rpk > RPK_BASE_END) + obj_uid = {}; + set_skin(obj_uid, rpk, osage_reset, bone_data, data, obj_db); +} + +// 0x140513970 +void RobDisp::set_body(object_info obj_uid, + const bone_database* bone_data, void* data, const object_database* obj_db) { + set_skin(obj_uid, RPK_BODY, false, bone_data, data, obj_db); +} + +// 0x140513980 +void RobDisp::set_col_color(ROB_PARTS_KIND rpk, const vec3& blend, const vec3& ofs) { + skin_disp[rpk].set_col_color(blend, ofs); +} + +// 0x1405139A0 +void RobDisp::set_col_specular(ROB_PARTS_KIND rpk, const vec3& blend, const vec3& ofs) { + skin_disp[rpk].set_col_specular(blend, ofs); +} + +// 0x1405139C0 +void RobDisp::set_col_type(ROB_PARTS_KIND rpk, int32_t type) { + skin_disp[rpk].set_col_type(type); +} + +void RobDisp::set_disable_collision(rob_osage_parts parts, bool disable) { skin_disp[parts == ROB_OSAGE_PARTS_MUFFLER ? RPK_OUTER : RPK_KAMI] .set_disable_collision((rob_osage_parts_bit)(1 << parts), disable); } -void rob_chara_item_equip::set_disp(ROB_PARTS_KIND rpk, bool value) { - skin_disp[rpk].can_disp = value; +void RobDisp::set_disp_flag(ROB_PARTS_KIND rpk, bool flag) { + skin_disp[rpk].can_disp = flag; } -void rob_chara_item_equip::set_item(object_info obj_uid, ROB_PARTS_KIND rpk, - bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db) { - if (rpk < 0 || rpk >= RPK_MAX || !motion_node) - return; - - skin_disp[rpk].set(obj_uid, motion_node, osage_reset, bone_data, data, obj_db); - set_disp(rpk, true); +// 0x140513B90 +void RobDisp::set_hyoutan(ROB_PARTS_KIND rpk, object_info obj_uid, object_info obj_uid_sub, + const bone_database* bone_data, void* data, const object_database* obj_db) { + if (rpk <= RPK_BODY || rpk >= RPK_MAX) { + obj_uid_sub = {}; + obj_uid = {}; + } + hyoutan_obj = obj_uid_sub; + hyoutan_rpk = rpk; + set_skin(obj_uid, rpk, false, bone_data, data, obj_db); + set_disp_flag(rpk, false); } -void rob_chara_item_equip::set_motion_reset_data(uint32_t motion_id, float_t frame) { +// 0x140513BF0 +void RobDisp::set_hyoutan_tex_change(const TexChange* texchg, int32_t tex_num) { + hyoutan_texchg_list.clear(); + if (tex_num && texchg) + hyoutan_texchg_list.insert(hyoutan_texchg_list.end(), texchg, texchg + tex_num); +} + +// 0x140513C40 +void RobDisp::set_item(ROB_PARTS_KIND rpk, object_info obj_uid, + const bone_database* bone_data, void* data, const object_database* obj_db) { + if (rpk < RPK_ITEM_BEGIN || rpk > RPK_ITEM_END) + obj_uid = {}; + set_skin(obj_uid, rpk, false, bone_data, data, obj_db); +} + +// 0x140513C60 +void RobDisp::set_merge(ROB_PARTS_KIND rpk, bool flag) { + if (flag) + parts_attr[rpk] &= ~0x04; + else + parts_attr[rpk] |= 0x04; +} + +void RobDisp::set_motion_node(const RobNode* mot_node, const bone_database* bone_data) { + motion_node = mot_node; + motion_matrix = mot_node->no_scale_mat; for (int32_t i = disp_begin; i < disp_max; i++) - skin_disp[i].set_motion_reset_data(motion_id, frame); + skin_disp[i].set_motion_node(mot_node, bone_data); +} + +void RobDisp::set_motion_reset_data(const uint32_t& motnum, const float_t& frame) { + for (int32_t i = disp_begin; i < disp_max; i++) + skin_disp[i].set_motion_reset_data(motnum, frame); task_wind->stage_wind.wind->reset(); } -void rob_chara_item_equip::set_motion_skin_param(int8_t chara_id, uint32_t motion_id, int32_t frame) { +void RobDisp::set_motion_skin_param(int8_t rob_id, uint32_t motnum, int32_t frame) { for (int32_t i = RPK_ITEM_BEGIN; i <= RPK_ITEM_END; i++) - skin_disp[i].set_motion_skin_param(chara_id, motion_id, frame); + skin_disp[i].set_motion_skin_param(rob_id, motnum, frame); } -void rob_chara_item_equip::set_null_blocks_expression_data(ROB_PARTS_KIND rpk, - const vec3& position, const vec3& rotation, const vec3& scale) { - skin_disp[rpk].set_null_blocks_expression_data(position, rotation, scale); +// 0x140513E00 +void RobDisp::set_ofs(ROB_PARTS_KIND rpk, const vec3& pos, const vec3& rot, const vec3& scale) { + skin_disp[rpk].set_ofs(pos, rot, scale); } -void rob_chara_item_equip::set_object_texture_pattern(ROB_PARTS_KIND rpk, - texture_pattern_struct* tex_pat, size_t count) { - skin_disp[rpk].set_texture_pattern(tex_pat, count); -} - -void rob_chara_item_equip::set_one_skin(bool value) { +void RobDisp::set_one_skin(bool value) { one_skin = value; if (value) { disp_begin = RPK_1SKIN_BEGIN; @@ -14596,16 +14662,16 @@ void rob_chara_item_equip::set_one_skin(bool value) { } } -void rob_chara_item_equip::set_opd_blend_data(std::list* a2) { +void RobDisp::set_opd_blend_data(std::list* a2) { opd_blend_data.clear(); if (!a2) return; for (motion_blend_mot*& i : *a2) { ::opd_blend_data v11; - v11.motion_id = i->mot_key_data.motion_id; + v11.motnum = i->mot_key_data.motnum; v11.frame = i->mot_play_data.frame_data.frame; - v11.frame_count = (float_t)i->mot_key_data.mot.frame_count - 1.0f; + v11.frame_max = (float_t)i->mot_key_data.mot.frame_max - 1.0f; v11.use_blend = false; #if OPD_PLAY_GEN v11.no_loop = false; @@ -14632,18 +14698,7 @@ void rob_chara_item_equip::set_opd_blend_data(std::list* a2) skin_disp[i].check_no_opd(opd_blend_data); } -void rob_chara_item_equip::set_osage_reset() { - for (int32_t i = disp_begin; i < disp_max; i++) - skin_disp[i].set_osage_reset(); - - task_wind->stage_wind.wind->reset(); -} - -void rob_chara_item_equip::set_osage_step(float_t value) { - osage_step = value; -} - -void rob_chara_item_equip::set_osage_move_cancel(uint8_t id, const float_t& mv_ccl) { +void RobDisp::set_osage_move_cancel(uint8_t id, const float_t& mv_ccl) { switch (id) { case 0: for (int32_t i = disp_begin; i < disp_max; i++) @@ -14658,106 +14713,344 @@ void rob_chara_item_equip::set_osage_move_cancel(uint8_t id, const float_t& mv_c } } -void rob_chara_item_equip::set_osage_play_data_init(ROB_PARTS_KIND rpk, const float_t* opdi_data) { +void RobDisp::set_osage_play_data_init(ROB_PARTS_KIND rpk, const float_t* opdi_data) { if (rpk >= RPK_ITEM_BEGIN && rpk <= RPK_ITEM_END) skin_disp[rpk].set_osage_play_data_init(opdi_data); } -void rob_chara_item_equip::set_shadow_group(int32_t chara_id) { - if (!chara_id) +void RobDisp::set_osage_reset() { + for (int32_t i = disp_begin; i < disp_max; i++) + skin_disp[i].set_osage_reset(); + + task_wind->stage_wind.wind->reset(); +} + +void RobDisp::set_osage_step(float_t value) { + osage_step = value; +} + +// 0x140514110 +void RobDisp::set_reflect(ROB_PARTS_KIND rpk, bool flag) { + if (flag) + parts_attr[rpk] &= ~0x02; + else + parts_attr[rpk] |= 0x02; +} + +// 0x140514130 +void RobDisp::set_shadow(ROB_PARTS_KIND rpk, bool flag) { + if (flag) + parts_attr[rpk] &= ~0x01; + else + parts_attr[rpk] |= 0x01; +} + +void RobDisp::set_shadow_group(int32_t rob_id) { + if (rob_id == ROB_ID_1P) shadow_group = SHADOW_GROUP_CHARA; else shadow_group = SHADOW_GROUP_STAGE; } -void rob_chara_item_equip::set_texture_pattern(texture_pattern_struct* tex_pat, size_t count) { - hyoutan_texchg_list.clear(); - if (count && tex_pat) - for (size_t i = 0; i < count; i++) - hyoutan_texchg_list.push_back(tex_pat[i]); +// 0x1405141B0 +void RobDisp::set_skin(object_info obj_uid, ROB_PARTS_KIND rpk, + bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db) { + if (rpk < 0 || rpk >= RPK_MAX || !motion_node) + return; + + skin_disp[rpk].set(obj_uid, motion_node, osage_reset, bone_data, data, obj_db); + set_disp_flag(rpk, true); } -void rob_chara_item_equip::skp_load(ROB_PARTS_KIND rpk, const skin_param_osage_root& skp_root, +// 0x1405143B0 +void RobDisp::set_tex_change(ROB_PARTS_KIND rpk, const TexChange* texchg, int32_t tex_num) { + skin_disp[rpk].set_tex_change(tex_num, texchg); +} + +void RobDisp::skp_load(ROB_PARTS_KIND rpk, const skin_param_osage_root& skp_root, std::vector& vec, skin_param_file_data* skp_file_data, const bone_database* bone_data) { if (rpk >= 0 && rpk < RPK_MAX) skin_disp[rpk].skp_load(skp_root, vec, skp_file_data, bone_data); } -item_cos_texture_change_tex::item_cos_texture_change_tex() : org(), chg(), changed() { +RobItemTXHD::RobItemTXHD() : src(), dst(), dst_copy() { } -item_cos_texture_change_tex::~item_cos_texture_change_tex() { +RobItemTXHD::~RobItemTXHD() { } -rob_chara_item_cos_data::rob_chara_item_cos_data() : curr_chara_num(), chara_num(), curr_cos(), cos() { - -} - -rob_chara_item_cos_data::~rob_chara_item_cos_data() { - -} - -bool rob_chara_item_cos_data::check_for_npr_flag() { - for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) { - const item_table_item* item = item_table_handler_array_get_item(chara_num, cos.arr[i]); - if (item && item->npr_flag) - return true; - } - return false; -} - -const item_cos_data* rob_chara_item_cos_data::get_cos() { - return &cos; -} - -object_info rob_chara_item_cos_data::get_head_object_replace(int32_t head_object_id) { - auto elem = head_replace.find(head_object_id); - if (elem != head_replace.end()) - return elem->second; - return {}; -} - -float_t rob_chara_item_cos_data::get_max_face_depth() { - float_t max_face_depth = 0.0f; - for (int32_t i = ITEM_SUB_ZUJO; i < ITEM_SUB_MAX; i++) { - const item_table_item* item = item_table_handler_array_get_item(chara_num, cos.arr[i]); - if (item && max_face_depth < item->face_depth) - max_face_depth = item->face_depth; - } - return max_face_depth; -} - -static void sub_140526FD0(rob_chara_item_cos_data* item_cos_data, - int32_t item_no, const item_table_item* item) { - if (!(item->attr & 0x0C)) +// 0x140522990 +void RobItem::equip_phase0(RobItemEquip* item_set) { + if (!get_rob_item_header(m_cn)) return; - if (!(item->attr & 0x08)) { - std::vector tex_chg_vec; - for (const item_table_item_data_tex& i : item->data.tex) { - item_cos_texture_change_tex chg_tex; - chg_tex.org = texture_manager_get_texture(i.org); - chg_tex.chg = texture_manager_get_texture(i.chg); - chg_tex.changed = false; - tex_chg_vec.push_back(chg_tex); + free_copy_texture_all(); + clear_texchg_list(); + + for (int32_t sub_id = 0; sub_id < ROB_ITEM_EQUIP_SUB_ID_MAX; sub_id++) { + uint32_t item_no = item_set->item_no[sub_id]; + if (!item_no || sub_id == ROB_ITEM_EQUIP_SUB_ID_HADA) + continue; + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (!tbl) + continue; + + make_chg_tex(item_no, tbl); + make_nude_attr_map(item_no, tbl); + } +} +// 0x140522A30 +void RobItem::equip_phase1(RobDisp* rdp, + const bone_database* bone_data, void* data, const object_database* obj_db) { + const RobData* rob_data = get_rob_data(m_cn); + for (int32_t i = RPK_BASE_BEGIN; i <= RPK_BASE_END; i++) { + ROB_PARTS_KIND rpk = (ROB_PARTS_KIND)i; + rdp->set_base(rpk, rob_data->body_obj_uid[i], false, bone_data, data, obj_db); + auto elem = m_nude_attr_map.find(rpk); + if (elem != m_nude_attr_map.end()) + set_texture(rdp, elem->second, rpk); + else + reset_texture(rdp, rpk); + } + + for (int32_t i = RPK_ITEM_BEGIN; i <= RPK_ITEM_END; i++) { + ROB_PARTS_KIND rpk = (ROB_PARTS_KIND)i; + rdp->set_item(rpk, {}, bone_data, data, obj_db); + reset_texture(rdp, rpk); + } + reset_texture(rdp, RPK_NONE, true); + + m_rpk_map.clear(); + m_rpk_sp_map.clear(); + m_head_map.clear(); +} + +// 0x140522C60 +void RobItem::equip_phase2(RobDisp* rdp, RobItemEquip* item_set, + const bone_database* bone_data, void* data, const object_database* obj_db) { + if (!get_rob_item_header(m_cn)) + return; + + const ROB_ITEM_EQUIP_SUB_ID* id = equip_sub_id_phase2; + while (*id != ROB_ITEM_EQUIP_SUB_ID_MAX) { + uint32_t item_no = item_set->item_no[*id]; + if (item_no) { + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (tbl && tbl->type != ROB_ITEM_TYPE_REM && (tbl->attr & ROB_ITEM_ATTR_OBJ)) + set_obj_phase2(rdp, item_no, tbl, *id, bone_data, data, obj_db); } - item_cos_data->texture_change.insert({ item_no, tex_chg_vec }); + id++; + } +} + +// 0x140522D00 +void RobItem::equip_phase3(RobDisp* rdp, RobItemEquip* item_set, + const bone_database* bone_data, void* data, const object_database* obj_db) { + if (!get_rob_item_header(m_cn)) + return; + + const ROB_ITEM_EQUIP_SUB_ID* id = equip_sub_id_phase3; + while (*id != ROB_ITEM_EQUIP_SUB_ID_MAX) { + uint32_t item_no = item_set->item_no[*id]; + if (item_no) { + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (tbl && tbl->type != ROB_ITEM_TYPE_REM && (tbl->attr & ROB_ITEM_ATTR_OBJ)) + set_obj_phase3(rdp, item_no, tbl, bone_data, data, obj_db); + } + id++; + } +} + +// 0x140522D90 +void RobItem::equip_phase4(RobDisp* rdp, RobItemEquip* item_set, + const bone_database* bone_data, void* data, const object_database* obj_db) { + if (!get_rob_item_header(m_cn)) + return; + + const ROB_ITEM_EQUIP_SUB_ID* id = equip_sub_id_phase4; + while (*id != ROB_ITEM_EQUIP_SUB_ID_MAX) { + uint32_t item_no = item_set->item_no[*id]; + if (!item_no) { + id++; + continue; + } + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (!tbl || tbl->type != ROB_ITEM_TYPE_REPLACE) + continue; + + for (const RobItemDataObj& i : tbl->data.obj) { + if (i.uid.is_null()) + continue; + + ROB_PARTS_KIND rpk = get_rpk_item(*id); + rdp->set_item(rpk, i.uid, bone_data, data, obj_db); + m_rpk_map.insert({ i.uid, rpk }); + if (tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX)) + set_texture(rdp, item_no, rpk); + + if (i.replace_id == RPK_NONE) + continue; + + rdp->set_base(i.replace_id, {}, false, bone_data, data, obj_db); + switch (i.replace_id) { + case RPK_UDE_R: + hide_rpk_sp(rdp, RPK_SP_UDE_R, bone_data, data, obj_db); + break; + case RPK_UDE_L: + hide_rpk_sp(rdp, RPK_SP_UDE_L, bone_data, data, obj_db); + break; + case RPK_TE_R: + hide_rpk_sp(rdp, RPK_SP_TE_R, bone_data, data, obj_db); + break; + case RPK_TE_L: + hide_rpk_sp(rdp, RPK_SP_TE_L, bone_data, data, obj_db); + break; + case RPK_SUNE: + hide_rpk_sp(rdp, RPK_SP_SUNE, bone_data, data, obj_db); + break; + case RPK_ASI: + hide_rpk_sp(rdp, RPK_SP_ASI, bone_data, data, obj_db); + break; + } + } + id++; + } +} + +// 0x140522F90 +void RobItem::equip_phase5(RobDisp* rdp, RobItemEquip* item_set) { + if (!get_rob_item_header(m_cn)) + return; + + uint32_t item_no = item_set->item_no[ROB_ITEM_EQUIP_SUB_ID_HADA]; + if (!item_no) + return; + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (!tbl || tbl->data.col.size()) + return; + + vec3 blend_color = tbl->data.col[0].color.blend_color; + vec3 offset_color = tbl->data.col[0].color.offset_color; + vec3 blend_specular = 1.0f; + vec3 offset_specular = 0.0f; + if (tbl->data.col.size() > 1) { + blend_specular = tbl->data.col[1].color.blend_color; + offset_specular = tbl->data.col[1].color.offset_color; + } + + for (int32_t i = RPK_DISP_BEGIN; i <= RPK_DISP_END; i++) { + ROB_PARTS_KIND rpk = (ROB_PARTS_KIND)i; + if (rdp->get_objid(rpk).is_null()) + continue; + + rdp->set_col_type(rpk, 0); + rdp->set_col_color(rpk, blend_color, offset_color); + rdp->set_col_specular(rpk, blend_specular, offset_specular); + } +} + +// 0x1405231D0 +void RobItem::equip_phase6(RobDisp* rdp, RobItemEquip* item_set) { + if (!get_rob_item_header(m_cn)) + return; + + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + equip_phase6(rdp, &m_equip, item_set->item_no[i]); +} + +// 0x140523230 +void RobItem::equip_phase6(RobDisp* rdp, RobItemEquip* item_set, uint32_t item_no) { + if (!item_no) + return; + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (!tbl || tbl->type == ROB_ITEM_TYPE_NONE || tbl->type == ROB_ITEM_TYPE_REM) + return; + + if (tbl->attr & ROB_ITEM_ATTR_OFS) + for (const RobItemDataOfs& i : tbl->data.ofs) { + if (item_set->item_no[i.equip_sub_id] != i.item_no) + continue; + + for (const RobItemDataObj& j : tbl->data.obj) { + if (j.uid.is_null()) + break; + + auto elem = m_rpk_map.find(j.uid); + if (elem != m_rpk_map.end()) + rdp->set_ofs(elem->second, i.trans, i.rot, i.scale); + } + break; + } + + for (const RobItemDataObj& i : tbl->data.obj) { + if (i.uid.is_null()) + break; + + auto elem = m_rpk_map.find(i.uid); + if (elem != m_rpk_map.end()) { + ROB_PARTS_KIND rpk = elem->second; + rdp->set_shadow(rpk, !(tbl->attr & ROB_ITEM_ATTR_NO_SDW)); + rdp->set_reflect(rpk, !(tbl->attr & ROB_ITEM_ATTR_NO_REF)); + rdp->set_merge(rpk, !(tbl->attr & ROB_ITEM_ATTR_NO_MRG)); + } + } +} + +// 0x1405234E0 +void RobItem::equip_phase7() { + init_nude_attr_map(); + m_rpk_map.clear(); + m_rpk_sp_map.clear(); +} + +// 0x140525B90 +ROB_PARTS_KIND RobItem::get_rpk_item(ROB_ITEM_EQUIP_SUB_ID id) const { + return rpk_item[id]; +} + +// 0x140525D90 +void RobItem::hide_rpk_sp(RobDisp* disp, int32_t rpk_sp, + const bone_database* bone_data, void* data, const object_database* obj_db) { + auto elem = m_rpk_sp_map.find(rpk_sp); + if (elem != m_rpk_sp_map.end()) + disp->set_item(elem->second, {}, bone_data, data, obj_db); +} + +// 0x140526FD0 +void RobItem::make_chg_tex(uint32_t item_no, const RobItemTable* tbl) { + if (!(tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX))) + return; + + if (!(tbl->attr & ROB_ITEM_ATTR_COL)) { + std::vector tex_chg_vec; + for (const RobItemDataTex& i : tbl->data.tex) { + RobItemTXHD txhd; + txhd.src = texture_manager_get_texture(i.org_uid); + txhd.dst = texture_manager_get_texture(i.chg_uid); + txhd.dst_copy = false; + tex_chg_vec.push_back(txhd); + } + m_txhd_map.insert({ item_no, tex_chg_vec }); return; } - else if (item->data.col.size() <= 0) + else if (tbl->data.col.size() <= 0) return; std::vector chg_tex_ids; - if (item->attr & 0x04) - for (const item_table_item_data_tex& i : item->data.tex) - chg_tex_ids.push_back(i.chg); + if (tbl->attr & ROB_ITEM_ATTR_TEX) + for (const RobItemDataTex& i : tbl->data.tex) + chg_tex_ids.push_back(i.chg_uid); else - for (const item_table_item_data_col& i : item->data.col) - chg_tex_ids.push_back(i.tex_id); + for (const RobItemDataCol& i : tbl->data.col) + chg_tex_ids.push_back(i.tex_uid); - std::vector tex_chg_vec; + std::vector tex_chg_vec; size_t index = 0; for (int32_t& i : chg_tex_ids) { size_t j = &i - chg_tex_ids.data(); @@ -14767,579 +15060,1063 @@ static void sub_140526FD0(rob_chara_item_cos_data* item_cos_data, continue; } - bool changed = false; - if (item->data.col[j].flag & 0x01) { + bool dst_copy = false; + if (tbl->data.col[j].flag.m.is_available) { tex = texture_create_copy_texture_apply_color_tone( - texture_manager_get_copy_id(0x30), tex, &item->data.col[j].col_tone); - changed = true; + texture_manager_get_copy_id(0x30), tex, &tbl->data.col[j].color); + dst_copy = true; } - item_cos_texture_change_tex chg_tex; - chg_tex.org = texture_manager_get_texture(item->data.col[j].tex_id); - chg_tex.chg = tex; - chg_tex.changed = changed; - tex_chg_vec.push_back(chg_tex); + RobItemTXHD txhd; + txhd.src = texture_manager_get_texture(tbl->data.col[j].tex_uid); + txhd.dst = tex; + txhd.dst_copy = dst_copy; + tex_chg_vec.push_back(txhd); } - item_cos_data->texture_change.insert({ item_no, tex_chg_vec }); + m_txhd_map.insert({ item_no, tex_chg_vec }); } -static void sub_140527280(rob_chara_item_cos_data* item_cos_data, - int32_t item_no, const item_table_item* item) { - if (!(item->attr & 0x20) || !(item->attr & 0x0C)) +// 0x140525200 +void RobItem::free_copy_texture_all() { + for (auto i = m_txhd_map.begin(); i != m_txhd_map.end(); i++) + free_copy_texture(i); + m_txhd_map.clear(); +} + +// 0x1405267E0 +void RobItem::init_nude_attr_map() { + m_nude_attr_map.clear(); +} + +// 0x140527280 +void RobItem::make_nude_attr_map(uint32_t item_no, const RobItemTable* tbl) { + if (!(tbl->attr & ROB_ITEM_ATTR_NUDE) || !(tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX))) return; - for (const item_table_item_data_obj& i : item->data.obj) { - if (i.rpk == RPK_NONE) + for (const RobItemDataObj& i : tbl->data.obj) { + if (i.replace_id == RPK_NONE) continue; - auto elem = item_cos_data->item_change.find(i.rpk); - if (elem == item_cos_data->item_change.end()) { + auto elem = m_nude_attr_map.find(i.replace_id); + if (elem == m_nude_attr_map.end()) { std::vector vec; vec.push_back(item_no); - item_cos_data->item_change.insert({ i.rpk, vec }); + m_nude_attr_map.insert({ i.replace_id, vec }); } else { std::vector vec = elem->second; vec.push_back(item_no); - item_cos_data->item_change.insert_or_assign(i.rpk, vec); + m_nude_attr_map.insert_or_assign(i.replace_id, vec); } } } -static void sub_140522990(rob_chara_item_cos_data* item_cos_data) { - item_cos_data->texture_change_clear(); - item_cos_data->texture_pattern_clear(); - for (int32_t sub_id = ITEM_SUB_ZUJO; sub_id < ITEM_SUB_MAX; sub_id++) { - int32_t item_no = item_cos_data->cos.arr[sub_id]; - if (!item_no || sub_id == ITEM_SUB_HADA) - continue; - - const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_num, item_no); - if (!item) - continue; - - sub_140526FD0(item_cos_data, item_no, item); - sub_140527280(item_cos_data, item_no, item); - } -} - -static void sub_140522A30(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp, +// 0x14052C560 +void RobItem::set_obj_phase2(RobDisp* rdp, uint32_t item_no, const RobItemTable* tbl, ROB_ITEM_EQUIP_SUB_ID id, const bone_database* bone_data, void* data, const object_database* obj_db) { - const RobData* rob_data = get_rob_data(item_cos_data->chara_num); - for (int32_t i = RPK_BASE_BEGIN; i <= RPK_BASE_END; i++) { - rob_disp->load_outfit_object_info((ROB_PARTS_KIND)i, - rob_data->body_obj_uid[i], false, bone_data, data, obj_db); - auto elem = item_cos_data->item_change.find(i); - if (elem != item_cos_data->item_change.end()) - item_cos_data->set_texture_pattern(rob_disp, elem->second, (ROB_PARTS_KIND)i, false); - else - item_cos_data->set_texture_pattern(rob_disp, (ROB_PARTS_KIND)i, false); - } - - for (int32_t i = RPK_ITEM_BEGIN; i <= RPK_ITEM_END; i++) { - rob_disp->load_body_parts_object_info((ROB_PARTS_KIND)i, {}, bone_data, data, obj_db); - item_cos_data->set_texture_pattern(rob_disp, (ROB_PARTS_KIND)i, false); - } - item_cos_data->set_texture_pattern(rob_disp, RPK_NONE, true); - - item_cos_data->field_F0.clear(); - item_cos_data->field_100.clear(); - item_cos_data->head_replace.clear(); -} - -static ROB_PARTS_KIND sub_140525B90(rob_chara_item_cos_data* item_cos_data, item_sub_id sub_id) { - const ROB_PARTS_KIND v3[] = { - RPK_ZUJO, RPK_KAMI, RPK_NONE, RPK_NONE, - RPK_MEGANE, RPK_NONE, RPK_KUCHI, RPK_NONE, - RPK_KUBI, RPK_NONE, RPK_OUTER, RPK_NONE, - RPK_NONE, RPK_NONE, RPK_NONE, RPK_NONE, - RPK_JOHA_USHIRO, RPK_NONE, RPK_NONE, RPK_PANTS, - RPK_NONE, RPK_NONE, RPK_NONE, RPK_NONE, - RPK_NONE, - }; - - return v3[sub_id]; -} - -static ROB_PARTS_KIND sub_140512EF0(rob_chara_item_equip* rob_disp, ROB_PARTS_KIND rpk) { - int32_t _rpk = rpk; - if (rpk < 0 || rpk >= RPK_DISP_END) - return RPK_NONE; - - for (rob_chara_item_equip_object* i = &rob_disp->skin_disp[rpk]; - i->obj_uid.not_null(); i++) { - if (++_rpk >= RPK_DISP_END) - return RPK_NONE; - } - return (ROB_PARTS_KIND)_rpk; -} - -static void sub_140513B90(rob_chara_item_equip* rob_disp, ROB_PARTS_KIND rpk, object_info a3, object_info a4, - const bone_database* bone_data, void* data, const object_database* obj_db) { - if (rpk <= RPK_BODY || rpk >= RPK_MAX) { - a4 = {}; - a3 = {}; - } - rob_disp->hyoutan_obj = a4; - rob_disp->hyoutan_rpk = rpk; - rob_disp->set_item(a3, rpk, false, bone_data, data, obj_db); - rob_disp->set_disp(rpk, false); -} - -static void sub_14052C560(rob_chara_item_cos_data* item_sub_data, - rob_chara_item_equip* rob_disp, int32_t item_no, const item_table_item* item, item_sub_id sub_id, - const bone_database* bone_data, void* data, const object_database* obj_db) { - for (const item_table_item_data_obj& i : item->data.obj) { - if (i.obj_info.is_null()) + for (const RobItemDataObj& i : tbl->data.obj) { + if (i.uid.is_null()) break; - if (item->type == 1) { - if (i.rpk != RPK_NONE) { - rob_disp->load_outfit_object_info(i.rpk, - i.obj_info, false, bone_data, data, obj_db); - if (item->attr & 0x0C) - item_sub_data->set_texture_pattern(rob_disp, item_no, i.rpk, false); + if (tbl->type == ROB_ITEM_TYPE_REPLACE) { + if (i.replace_id != RPK_NONE) { + rdp->set_base(i.replace_id, i.uid, false, bone_data, data, obj_db); + if (tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX)) + set_texture(rdp, item_no, i.replace_id); } continue; } - else if (item->type) + else if (tbl->type) continue; - ROB_PARTS_KIND rpk = sub_140525B90(item_sub_data, sub_id); + ROB_PARTS_KIND rpk = get_rpk_item(id); if (rpk != RPK_NONE) { - rob_disp->load_body_parts_object_info(rpk, i.obj_info, bone_data, data, obj_db); - item_sub_data->field_F0.insert({ i.obj_info, rpk }); - if (item->attr & 0x0C) - item_sub_data->set_texture_pattern(rob_disp, item_no, rpk, false); + rdp->set_item(rpk, i.uid, bone_data, data, obj_db); + m_rpk_map.insert({ i.uid, rpk }); + if (tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX)) + set_texture(rdp, item_no, rpk); } else { - ROB_PARTS_KIND rpk = sub_140512EF0(rob_disp, RPK_ITEM09); - if (rpk != RPK_NONE && (!(item->attr & 0x10) || &i - item->data.obj.data())) { - bool v8 = false; - if (item->attr & 0x10 && &i - item->data.obj.data() == 1) { - sub_140513B90(rob_disp, rpk, item->data.obj[1].obj_info, - item->data.obj[0].obj_info, bone_data, data, obj_db); - v8 = true; + ROB_PARTS_KIND rpk = rdp->get_free_item(RPK_ITEM_ETC_BEGIN); + if (rpk != RPK_NONE && (!(tbl->attr & ROB_ITEM_ATTR_HYOUTAN) || &i - tbl->data.obj.data())) { + bool is_hyoutan = false; + if ((tbl->attr & ROB_ITEM_ATTR_HYOUTAN) && &i - tbl->data.obj.data() == 1) { + rdp->set_hyoutan(rpk, tbl->data.obj[1].uid, + tbl->data.obj[0].uid, bone_data, data, obj_db); + is_hyoutan = true; } else - rob_disp->load_body_parts_object_info(rpk, i.obj_info, bone_data, data, obj_db); - item_sub_data->field_F0.insert({ i.obj_info, rpk }); - if (item->attr & 0x0C) - item_sub_data->set_texture_pattern(rob_disp, item_no, rpk, v8); + rdp->set_item(rpk, i.uid, bone_data, data, obj_db); + m_rpk_map.insert({ i.uid, rpk }); + if (tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX)) + set_texture(rdp, item_no, rpk, is_hyoutan); } } } - item_sub_data->head_replace.clear(); - if (!(item->attr & 0x800)) + m_head_map.clear(); + if (!(tbl->attr & ROB_ITEM_ATTR_HEAD)) return; - const char* chara_name = get_chara_name(item_sub_data->chara_num); + const char* chara_name = get_chara_name(m_cn); for (int32_t i = 0; i < 9; i++) { std::string buf = sprintf_s_string("%sITM%03d_ATAM_HEAD_%02d_SP__DIVSKN", chara_name, item_no, i); object_info obj_info = obj_db->get_object_info(buf.c_str()); if (obj_info.not_null()) - item_sub_data->head_replace.insert({ i, obj_info }); + m_head_map.insert({ i, obj_info }); } } -static void sub_140522C60(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp, +// 0x14052C8C0 +void RobItem::set_obj_phase3(RobDisp* rdp, uint32_t item_no, const RobItemTable* tbl, const bone_database* bone_data, void* data, const object_database* obj_db) { - if (!item_table_handler_array_get_table(item_cos_data->chara_num)) - return; - - const item_sub_id dword_140A2BB70[] = { - ITEM_SUB_ZUJO, ITEM_SUB_KAMI, ITEM_SUB_HITAI, ITEM_SUB_ME, ITEM_SUB_MEGANE, - ITEM_SUB_MIMI, ITEM_SUB_KUCHI, ITEM_SUB_MAKI, ITEM_SUB_KUBI, ITEM_SUB_INNER, - ITEM_SUB_KATA, ITEM_SUB_U_UDE, ITEM_SUB_L_UDE, ITEM_SUB_JOHA_MAE, ITEM_SUB_JOHA_USHIRO, - ITEM_SUB_BELT, ITEM_SUB_KOSI, ITEM_SUB_SUNE, ITEM_SUB_KUTSU, ITEM_SUB_HEAD, ITEM_SUB_MAX, - }; - - const item_sub_id* v6 = dword_140A2BB70; - while (*v6 != ITEM_SUB_MAX) { - int32_t item_no = item_cos_data->cos.arr[*v6]; - if (item_no) { - const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_num, item_no); - if (item && item->type != 3 && item->attr & 0x01) - sub_14052C560(item_cos_data, rob_disp, item_no, item, *v6, bone_data, data, obj_db); - } - v6++; - } -} - -static void sub_14052C8C0(rob_chara_item_cos_data* item_cos_data, - rob_chara_item_equip* rob_disp, int32_t item_no, const item_table_item* item, - const bone_database* bone_data, void* data, const object_database* obj_db) { - for (const item_table_item_data_obj& i : item->data.obj) { - object_info v11 = i.obj_info; - ROB_PARTS_KIND rpk = i.rpk; - if (item->type == 1) { - if (v11.is_null()) { + for (const RobItemDataObj& i : tbl->data.obj) { + object_info uid = i.uid; + ROB_PARTS_KIND replace_id = i.replace_id; + if (tbl->type == ROB_ITEM_TYPE_REPLACE) { + if (uid.is_null()) { + if (replace_id == RPK_NONE) + continue; + } + else if (replace_id == RPK_NONE); + else if (i.replace_id >= RPK_SP_UDE_L && i.replace_id <= RPK_SP_ASI) { + ROB_PARTS_KIND rpk = rdp->get_free_item(RPK_ITEM_BEGIN); if (rpk == RPK_NONE) continue; - } - else if (rpk == RPK_NONE) { - } - else if (i.rpk < 100 || i.rpk > 105) { - rob_disp->load_outfit_object_info(rpk, - v11, false, bone_data, data, obj_db); + + rdp->set_item(rpk, uid, bone_data, data, obj_db); + m_rpk_map.insert({ uid, rpk }); + m_rpk_sp_map.insert({ replace_id, rpk }); + replace_id = rpk; } else { - ROB_PARTS_KIND v13 = sub_140512EF0(rob_disp, RPK_KAMI); - if (v13 == RPK_NONE) - continue; - - rob_disp->load_body_parts_object_info(v13, i.obj_info, bone_data, data, obj_db); - item_cos_data->field_F0.insert({ i.obj_info, v13 }); - item_cos_data->field_100.insert({ rpk, v13 }); - rpk = v13; + rdp->set_base(replace_id, uid, false, bone_data, data, obj_db); } } - else if (!item->type) { - rpk = sub_140512EF0(rob_disp, RPK_ITEM09); - if (rpk != RPK_NONE) { - rob_disp->load_body_parts_object_info(rpk, i.obj_info, bone_data, data, obj_db); - item_cos_data->field_F0.insert({ i.obj_info, rpk }); + else if (!tbl->type) { + replace_id = rdp->get_free_item(RPK_ITEM_ETC_BEGIN); + if (replace_id != RPK_NONE) { + rdp->set_item(replace_id, uid, bone_data, data, obj_db); + m_rpk_map.insert({ uid, replace_id }); continue; } } else continue; - if (item->attr & 0x0C) - item_cos_data->set_texture_pattern(rob_disp, item_no, rpk, false); + if (tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX)) + set_texture(rdp, item_no, replace_id); } } -static void sub_140522D00(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp, - const bone_database* bone_data, void* data, const object_database* obj_db) { - if (!item_table_handler_array_get_table(item_cos_data->chara_num)) - return; - - const item_sub_id dword_140A2BBC8[] = { - ITEM_SUB_TE, ITEM_SUB_ASI, ITEM_SUB_MAX, - }; - - const item_sub_id* v6 = dword_140A2BBC8; - while (*v6 != ITEM_SUB_MAX) { - int32_t item_no = item_cos_data->cos.arr[*v6]; - if (item_no) { - const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_num, item_no); - if (item && item->type != 3 && item->attr & 0x01) - sub_14052C8C0(item_cos_data, rob_disp, item_no, item, bone_data, data, obj_db); - } - v6++; - } -} - -static void sub_140525D90(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp, - int32_t a3, const bone_database* bone_data, void* data, const object_database* obj_db) { - auto elem = item_cos_data->field_100.find(a3); - if (elem != item_cos_data->field_100.end()) - rob_disp->load_body_parts_object_info(elem->second, {}, bone_data, data, obj_db); -} - -static void sub_140522D90(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp, - const bone_database* bone_data, void* data, const object_database* obj_db) { - if (!item_table_handler_array_get_table(item_cos_data->chara_num)) - return; - - const item_sub_id dword_140A2BBD8[] = { - ITEM_SUB_PANTS, ITEM_SUB_OUTER, ITEM_SUB_MAX, - }; - - const item_sub_id* v6 = dword_140A2BBD8; - while (*v6 != ITEM_SUB_MAX) { - int32_t item_no = item_cos_data->cos.arr[*v6]; - if (!item_no) { - v6++; - continue; - } - - const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_num, item_no); - if (!item || item->type != 1) - continue; - - for (const item_table_item_data_obj& i : item->data.obj) { - if (i.obj_info.is_null()) - continue; - - ROB_PARTS_KIND rpk = sub_140525B90(item_cos_data, *v6); - rob_disp->load_body_parts_object_info(rpk, i.obj_info, bone_data, data, obj_db); - item_cos_data->field_F0.insert({ i.obj_info, rpk }); - if (item->attr & 0x0C) - item_cos_data->set_texture_pattern(rob_disp, item_no, rpk, false); - - if (i.rpk == RPK_NONE) - continue; - - rob_disp->load_outfit_object_info(i.rpk, - {}, false, bone_data, data, obj_db); - switch (i.rpk) { - case RPK_UDE_R: - sub_140525D90(item_cos_data, rob_disp, 102, bone_data, data, obj_db); - break; - case RPK_UDE_L: - sub_140525D90(item_cos_data, rob_disp, 100, bone_data, data, obj_db); - break; - case RPK_TE_R: - sub_140525D90(item_cos_data, rob_disp, 103, bone_data, data, obj_db); - break; - case RPK_TE_L: - sub_140525D90(item_cos_data, rob_disp, 101, bone_data, data, obj_db); - break; - case RPK_SUNE: - sub_140525D90(item_cos_data, rob_disp, 104, bone_data, data, obj_db); - break; - case RPK_ASI: - sub_140525D90(item_cos_data, rob_disp, 105, bone_data, data, obj_db); - break; - } - } - v6++; - } -} - -static void sub_140522F90(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp) { - if (!item_table_handler_array_get_table(item_cos_data->chara_num)) - return; - - int32_t item_no = item_cos_data->cos.arr[ITEM_SUB_HADA]; - if (!item_no) - return; - - const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_num, item_no); - if (!item || item->data.col.size()) - return; - - vec3 blend_color = item->data.col[0].col_tone.blend; - vec3 offset_color = item->data.col[0].col_tone.offset; - vec3 blend_specular = 1.0f; - vec3 offset_specular = 0.0f; - if (item->data.col.size() > 1) { - blend_specular = item->data.col[1].col_tone.blend; - offset_specular = item->data.col[1].col_tone.offset; - } - - for (int32_t i = RPK_ATAMA; i <= RPK_ITEM16; i++) { - if (rob_disp->get_object_info((ROB_PARTS_KIND)i).is_null()) - continue; - - rob_chara_item_equip_object* skin_disp = &rob_disp->skin_disp[i]; - skin_disp->skn_col.type = 0; - skin_disp->skn_col.blend_color = blend_color; - skin_disp->skn_col.offset_color = offset_color; - skin_disp->skn_col.blend_specular = blend_specular; - skin_disp->skn_col.offset_specular = offset_specular; - } -} - -static void sub_140523230(rob_chara_item_cos_data* item_cos_data, - rob_chara_item_equip* rob_disp, int32_t item_no) { - if (!item_no) - return; - - const item_table_item* item = item_table_handler_array_get_item(item_cos_data->chara_num, item_no); - if (!item || !((item->type + 1) & ~0x04)) - return; - - if (item->attr & 0x02) - for (const item_table_item_data_ofs& i : item->data.ofs) { - if (item_cos_data->cos.arr[i.sub_id] != i.no) - continue; - - for (const item_table_item_data_obj& j : item->data.obj) { - if (j.obj_info.is_null()) - break; - - auto elem = item_cos_data->field_F0.find(j.obj_info); - if (elem != item_cos_data->field_F0.end()) - rob_disp->set_null_blocks_expression_data( - elem->second, i.position, i.rotation, i.scale); - } - break; - } - - for (const item_table_item_data_obj& i : item->data.obj) { - if (i.obj_info.is_null()) - break; - - auto elem = item_cos_data->field_F0.find(i.obj_info); - if (elem != item_cos_data->field_F0.end()) { - ROB_PARTS_KIND rpk = elem->second; - sub_140514130(rob_disp, rpk, !(item->attr & 0x80)); - sub_140514110(rob_disp, rpk, !(item->attr & 0x100)); - sub_140513C60(rob_disp, rpk, !(item->attr & 0x400)); - } - } -} - -static void sub_1405231D0(rob_chara_item_cos_data* item_cos_data, rob_chara_item_equip* rob_disp) { - if (!item_table_handler_array_get_table(item_cos_data->chara_num)) - return; - - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) - sub_140523230(item_cos_data, rob_disp, item_cos_data->cos.arr[i]); -} - -static void sub_1405234E0(rob_chara_item_cos_data* item_cos_data) { - item_cos_data->item_change.clear(); - item_cos_data->field_F0.clear(); - item_cos_data->field_100.clear(); -} - -void rob_chara_item_cos_data::reload_items(int32_t chara_id, - const bone_database* bone_data, void* data, const object_database* obj_db) { - rob_chara_item_equip* rob_disp = rob_chara_array_get_rob_disp(chara_id); - sub_140522990(this); - sub_140522A30(this, rob_disp, bone_data, data, obj_db); - sub_140522C60(this, rob_disp, bone_data, data, obj_db); - sub_140522D00(this, rob_disp, bone_data, data, obj_db); - sub_140522D90(this, rob_disp, bone_data, data, obj_db); - sub_140522F90(this, rob_disp); - sub_1405231D0(this, rob_disp); - sub_1405234E0(this); -} - -void rob_chara_item_cos_data::set_chara_num(CHARA_NUM chara_num) { - this->chara_num = chara_num; -} - -void rob_chara_item_cos_data::set_chara_num_item(CHARA_NUM chara_num, int32_t item_no) { - set_chara_num(chara_num); - set_item(item_no); -} - -void rob_chara_item_cos_data::set_chara_num_item_nos(CHARA_NUM chara_num, const int32_t* items) { - set_chara_num(chara_num); - set_item_nos(items); -} - -void rob_chara_item_cos_data::set_chara_num_item_zero(CHARA_NUM chara_num, int32_t item_no) { - set_chara_num(chara_num); - set_item_zero(item_no); -} - -void rob_chara_item_cos_data::set_item(int32_t item_no) { - if (!item_no) - return; - - const item_table_item* item = item_table_handler_array_get_item(chara_num, item_no); - if (item) - cos.arr[item->sub_id] = item_no; -} - -void rob_chara_item_cos_data::set_item_array(const rob_chara_pv_data_item& item) { - for (int32_t i = 0; i < 4; i++) - set_item(item.arr[i]); -} - -void rob_chara_item_cos_data::set_item_no(item_sub_id sub_id, int32_t item_no) { - cos.arr[sub_id] = item_no; -} - -void rob_chara_item_cos_data::set_item_nos(const int32_t* item_nos) { - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) - set_item_no((item_sub_id)i, item_nos[i]); -} - -void rob_chara_item_cos_data::set_item_zero(int32_t item_no) { - const item_table_item* item = item_table_handler_array_get_item(chara_num, item_no); - if (item) - cos.arr[item->sub_id] = 0; -} - -void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_disp, - ROB_PARTS_KIND rpk, bool tex_pat_for_all) { - if (tex_pat_for_all) - rob_disp->set_texture_pattern(0, 0); - else - rob_disp->set_object_texture_pattern(rpk, 0, 0); -} - -void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_disp, - uint32_t item_no, ROB_PARTS_KIND rpk, bool tex_pat_for_all) { - if (rpk < 0 || rpk >= RPK_MAX) - return; - - auto elem = texture_change.find(item_no); - if (elem == texture_change.end()) - return; - - for (item_cos_texture_change_tex& i : elem->second) - if (i.org && i.chg) - texture_pattern[rpk].push_back({ i.org->id, i.chg->id }); - - if (tex_pat_for_all) - rob_disp->set_texture_pattern(texture_pattern[rpk].data(), texture_pattern[rpk].size()); - else - rob_disp->set_object_texture_pattern(rpk, - texture_pattern[rpk].data(), texture_pattern[rpk].size()); -} - -void rob_chara_item_cos_data::set_texture_pattern(rob_chara_item_equip* rob_disp, - const std::vector& item_nos, ROB_PARTS_KIND rpk, bool tex_pat_for_all) { +// 0x14052CCC0 +void RobItem::set_texture(RobDisp* rdp, + const std::vector& item_nos, ROB_PARTS_KIND rpk, bool is_hyoutan) { if (rpk < 0 || rpk >= RPK_MAX) return; for (const uint32_t& i : item_nos) { - auto elem = texture_change.find(i); - if (elem == texture_change.end()) + auto elem = m_txhd_map.find(i); + if (elem == m_txhd_map.end()) continue; - for (item_cos_texture_change_tex& j : elem->second) - if (j.org && j.chg) - texture_pattern[rpk].push_back({ j.org->id, j.chg->id }); + for (RobItemTXHD& j : elem->second) + if (j.src && j.dst) + m_texchg_list[rpk].push_back({ j.src->id, j.dst->id }); } - if (tex_pat_for_all) - rob_disp->set_texture_pattern( - texture_pattern[rpk].data(), texture_pattern[rpk].size()); + if (is_hyoutan) + rdp->set_hyoutan_tex_change(m_texchg_list[rpk].data(), (int32_t)m_texchg_list[rpk].size()); else - rob_disp->set_object_texture_pattern(rpk, - texture_pattern[rpk].data(), texture_pattern[rpk].size()); + rdp->set_tex_change(rpk, m_texchg_list[rpk].data(), (int32_t)m_texchg_list[rpk].size()); } -void rob_chara_item_cos_data::texture_change_clear() { - for (auto i : texture_change) - for (item_cos_texture_change_tex& j : i.second) - if (j.changed) { - texture_release(j.chg); - j.chg = 0; - } - texture_change.clear(); +// 0x14052CB70 +void RobItem::set_texture(RobDisp* rdp, uint32_t item_no, ROB_PARTS_KIND rpk, bool is_hyoutan) { + if (rpk < 0 || rpk >= RPK_MAX) + return; + + auto elem = m_txhd_map.find(item_no); + if (elem == m_txhd_map.end()) + return; + + for (RobItemTXHD& i : elem->second) + if (i.src && i.dst) + m_texchg_list[rpk].push_back({ i.src->id, i.dst->id }); + + if (is_hyoutan) + rdp->set_hyoutan_tex_change(m_texchg_list[rpk].data(), (int32_t)m_texchg_list[rpk].size()); + else + rdp->set_tex_change(rpk, m_texchg_list[rpk].data(), (int32_t)m_texchg_list[rpk].size()); } -void rob_chara_item_cos_data::texture_pattern_clear() { - for (std::vector& i : texture_pattern) +// 0x14052B4C0 +void RobItem::reset_texture(RobDisp* rdp, ROB_PARTS_KIND rpk, bool is_hyoutan) { + if (is_hyoutan) + rdp->set_hyoutan_tex_change(0, 0); + else + rdp->set_tex_change(rpk, 0, 0); +} + +// 0x140521A30 +void RobItem::clear_texchg_list() { + for (std::vector& i : m_texchg_list) i.clear(); } -struc_523::struc_523() : field_0(), field_1(), field_4(), field_8(), field_C(), -field_10(), field_1C(), field_20(), field_24(), field_28(), field_2C(), field_30(), -field_34(), field_38(), field_3C(), field_40(), field_44(), field_48(), field_4C(), -field_50(), field_54(), field_68(), field_70(), field_78(), field_7C(), field_80() { +// 0x140522480 +void RobItem::disp_obj_internal(object_info obj_uid, mat4& mat, uint32_t item_no, render_context* rctx) { + static mat4 env_mtx[MATRIX_BUFFER_COUNT]; + + TexChange* texchg = 0; + size_t num_texchg = 0; + + obj_skin* skin = objset_info_storage_get_obj_skin(obj_uid); + + auto elem = m_txhd_map.find(item_no); + if (elem != m_txhd_map.end()) { + std::vector tex_chg_vec = elem->second; + num_texchg = tex_chg_vec.size(); + if (num_texchg) { + texchg = new TexChange[num_texchg]; + const RobItemTXHD* item_txhd = tex_chg_vec.data(); + for (size_t i = 0; i < num_texchg; i++) { + texchg[i].org_texid = item_txhd[i].src->id; + texchg[i].change_texid = item_txhd[i].dst->id; + } + } + } + + if (!skin) + rctx->disp_manager->entry_obj_by_object_info(mat4_identity, obj_uid); + else if (skin->num_bone <= MATRIX_BUFFER_COUNT) { + for (int32_t i = 0; i < skin->num_bone; i++) + env_mtx[i] = mat; + rctx->disp_manager->entry_obj_by_object_info(mat4_identity, obj_uid, env_mtx); + } + + if (num_texchg) { + rctx->disp_manager->set_texture_pattern(0, 0); + delete[] texchg; + } +} + +// 0x14052C430 +bool RobItem::s_repair_equip(CHARA_NUM cn, uint32_t item_no, int32_t id, RobItemEquip* rep_item_set) { + const RobItemEquip* item_set = get_default_costume_data(cn, item_no); + if (item_set) { + rep_item_set->item_no[id] = item_set->item_no[id]; + return true; + } + return false; +} + +RobItem::RobItem() : m_cn(), m_cn_load(), m_equip(), m_equip_load() { } -struc_523::~struc_523() { +RobItem::~RobItem() { + free_copy_texture_all(); + init_nude_attr_map(); + clear_texchg_list(); + m_rpk_map.clear(); + m_rpk_sp_map.clear(); + m_head_map.clear(); +} + +// 0x14052C530 +void RobItem::set_chara_num(CHARA_NUM cn) { + m_cn = cn; +} + +// 0x14052AE30 +void RobItem::req_obj(uint32_t item_no, void* data, const object_database* obj_db) { + if (!item_no) + return; + + m_cn_load = m_cn; + const std::vector* item_objset = get_rob_item_table_objset(m_cn, item_no); + if (!item_objset) + return; + + for (uint32_t i : *item_objset) + objset_info_storage_load_set(data, obj_db, i); +} + +// 0x14052D3D0 +bool RobItem::wait_obj(uint32_t item_no) { + if (!item_no) + return false; + + const std::vector* item_objset = get_rob_item_table_objset(m_cn_load, item_no); + if (!item_objset || !item_objset->size()) + return false; + + for (uint32_t i : *item_objset) + if (i != (uint32_t)-1 && objset_info_storage_load_obj_set_check_not_read(i)) + return true; + return false; +} + +// 0x1405253A0 +void RobItem::free_obj(uint32_t item_no) { + if (!item_no) + return; + + const std::vector* item_objset = get_rob_item_table_objset(m_cn_load, item_no); + if (!item_objset) + return; + + for (uint32_t i : *item_objset) + objset_info_storage_unload_set(i); + + free_copy_texture(item_no); +} + +// 0x14052AEA0 +void RobItem::req_obj_all(void* data, const object_database* obj_db) { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) { + uint32_t item_no = m_equip.item_no[i]; + if (item_no && m_equip_load.item_no[i] != item_no) { + req_obj(item_no, data, obj_db); + m_equip_load.item_no[i] = item_no; + } + } +} + +// 0x14052D460 +bool RobItem::wait_obj_all() { + bool ret = false; + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + if (m_equip_load.item_no[i]) + ret |= wait_obj(m_equip_load.item_no[i]); + return ret; +} + +// 0x1405254B0 +void RobItem::free_obj_all() { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + if (m_equip_load.item_no[i]) + free_obj(m_equip_load.item_no[i]); +} + +// 0x140525500 +void RobItem::free_obj_diff() { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) { + uint32_t item_no = m_equip_load.item_no[i]; + if (item_no && m_equip.item_no[i] != item_no) { + free_obj(item_no); + m_equip_load.item_no[i] = 0; + } + } +} + +// 0x14052AD90 +void RobItem::regist_item(ROB_ITEM_EQUIP_SUB_ID id, uint32_t item_no) { + m_equip.item_no[id] = item_no; +} + +// 0x14052ADF0 +void RobItem::regist_item_one(uint32_t item_no) { + if (!item_no) + return; + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (tbl) + regist_item(tbl->equip_sub_id, item_no); +} + +// 0x14052ADA0 +void RobItem::regist_item_all(const RobItemEquip* item_set) { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + regist_item((ROB_ITEM_EQUIP_SUB_ID)i, item_set->item_no[i]); +} + +// 0x140521FA0 +void RobItem::delete_item(uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (tbl) + m_equip.item_no[tbl->equip_sub_id] = 0; +} + +void RobItem::equip(int32_t rc, const bone_database* bone_data, + void* data, const object_database* obj_db) { + RobDisp* disp = get_rob_management()->get_rob_robdisp_work((ROB_ID)rc); + equip_phase0(&m_equip); + equip_phase1(disp, bone_data, data, obj_db); + equip_phase2(disp, &m_equip, bone_data, data, obj_db); + equip_phase3(disp, &m_equip, bone_data, data, obj_db); + equip_phase4(disp, &m_equip, bone_data, data, obj_db); + equip_phase5(disp, &m_equip); + equip_phase6(disp, &m_equip); + equip_phase7(); +} + +// 0x140525730 +ROB_ITEM_EQUIP_ID RobItem::get_equip_id(uint32_t item_no) const { + if (!get_rob_item_header(m_cn)) + return ROB_ITEM_EQUIP_ID_NONE; + + ROB_ITEM_EQUIP_SUB_ID id = s_get_equip_sub_id(m_cn, item_no); + if (id != ROB_ITEM_EQUIP_SUB_ID_NONE) + return equip_id_conv_table[id]; + return ROB_ITEM_EQUIP_ID_NONE; +} + +// 0x140525780 +ROB_ITEM_EQUIP_SUB_ID RobItem::get_equip_sub_id(uint32_t item_no) const { + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (tbl) + return tbl->equip_sub_id; + return ROB_ITEM_EQUIP_SUB_ID_NONE; +} + +// Missing +uint32_t RobItem::check_exclusive_item(uint32_t item_no) const { + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (tbl && tbl->equip_sub_id != -1) + return m_equip.item_no[tbl->equip_sub_id]; + return 0; +} + +// 0x140525AA0 +RobItemEquip* RobItem::get_equip() { + return (RobItemEquip*)((const RobItem*)this)->get_equip(); +} + +// 0x140525720 +const RobItemEquip* RobItem::get_equip() const { + return &m_equip; +} + +// Missing +bool RobItem::is_equipped_item(uint32_t item_no) const { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + if (m_equip.item_no[i] == item_no) + return true; + return false; +} + +// 0x140525F80 +void RobItem::init_disp_obj(uint32_t item_no) { + if (!item_no) + return; + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (!tbl) + return; + + make_chg_tex(item_no, tbl); +} + +// 0x1405223C0 +void RobItem::disp_obj(uint32_t item_no, render_context* rctx, const mat4& global_mat) { + if (!item_no) + return; + + const RobItemTable* tbl = get_rob_item_table(m_cn, item_no); + if (!tbl) + return; + + mat4 mat = global_mat; + for (const RobItemDataObj& i : tbl->data.obj) + if (i.uid.not_null()) + disp_obj_internal(i.uid, mat, item_no, rctx); +} + +void RobItem::get_item_texchange_list(uint32_t item_no, std::vector& tex_chg_list) { + auto elem = m_txhd_map.find(item_no); + if (elem != m_txhd_map.end()) { + std::vector tex_chg_vec = elem->second; + for (RobItemTXHD& i : tex_chg_vec) + tex_chg_list.push_back({ i.src->id, i.dst->id }); + } +} + +// Missing +RobItemEquip* RobItem::get_equip_load() { + return (RobItemEquip*)((const RobItem*)this)->get_equip_load(); +} + +// Missing +const RobItemEquip* RobItem::get_equip_load() const { + return &m_equip_load; +} + +bool RobItem::check_for_npr_flag() const { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) { + const RobItemTable* tbl = get_rob_item_table(m_cn, m_equip.item_no[i]); + if (tbl && tbl->npr_flag) + return true; + } + return false; +} + +object_info RobItem::get_head_object_replace(int32_t head_object_id) const { + auto elem = m_head_map.find(head_object_id); + if (elem != m_head_map.end()) + return elem->second; + return {}; +} + +float_t RobItem::get_face_depth() const { + float_t face_depth = 0.0f; + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) { + const RobItemTable* tbl = get_rob_item_table(m_cn, m_equip.item_no[i]); + if (tbl) + face_depth = max_def(tbl->face_depth, face_depth); + } + return face_depth; +} + +const char* RobItem::s_get_equip_sub_id_str(ROB_ITEM_EQUIP_SUB_ID id) { + if (id >= 0 && id < ROB_ITEM_EQUIP_SUB_ID_MAX) + return rob_item_equip_sub_id_str[id]; + return 0; +} + +// 0x140525A40 +const char* RobItem::s_get_name(const CHARA_NUM& cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return tbl->name.c_str(); + return 0; +} + +// 0x14052BDC0 +ROB_ITEM_EQUIP_ID RobItem::s_get_equip_id(CHARA_NUM cn, uint32_t item_no) { + if (!get_rob_item_header(cn)) + return ROB_ITEM_EQUIP_ID_NONE; + + ROB_ITEM_EQUIP_SUB_ID id = s_get_equip_sub_id(cn, item_no); + if (id != ROB_ITEM_EQUIP_SUB_ID_NONE) + return equip_id_conv_table[id]; + return ROB_ITEM_EQUIP_ID_NONE; +} + +// 0x14052BF00 +ROB_ITEM_EQUIP_SUB_ID RobItem::s_get_equip_sub_id(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return tbl->equip_sub_id; + return ROB_ITEM_EQUIP_SUB_ID_NONE; +} + +// Missing +void RobItem::s_get_equip_sub_group(int32_t id, std::vector* sub_group) { + if (!sub_group) + return; + + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + if (id != equip_id_conv_table[i]) + sub_group->push_back(i); +} + +// 0x14052CAC0 +void RobItem::regist_item_all(const RobItemEquipInit* item_set) { + for (int32_t i = 0; i < 4; i++) + regist_item_one(item_set->item_no[i]); +} + +// 0x140525160 +void RobItem::free_copy_texture(uint32_t item_no) { + auto elem = m_txhd_map.find(item_no); + if (elem != m_txhd_map.end()) { + free_copy_texture(elem); + m_txhd_map.erase(elem); + } +} + +// 0x140525340 +void RobItem::free_copy_texture(std::map>::iterator elem) { + for (RobItemTXHD& i : elem->second) + if (i.dst_copy) + texture_release(i.dst); + elem->second.clear(); +} + +// 0x14052BB30 +bool RobItem::s_is_replace_part(CHARA_NUM cn, uint32_t item_no, ROB_ITEM_EQUIP_SUB_ID id) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) { + if (id == ROB_ITEM_EQUIP_SUB_ID_HADA || tbl->type == ROB_ITEM_TYPE_REM) + return true; + return get_rob_item_table_objset(cn, item_no); + } + return false; +} + +// 0x14052BBA0 +bool RobItem::s_equip_ok(CHARA_NUM cn, uint32_t item_no, ROB_ITEM_EQUIP_SUB_ID id) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return id == tbl->equip_sub_id; + return false; +} + +// 0x14052BF40 +uint32_t RobItem::s_get_exclusion(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return tbl->exclusion; + return 0; +} + +// 0x14052C370 +uint32_t RobItem::s_get_point(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) { + int32_t ret = s_check_ng_item_point(cn, item_no); + if (ret < 0) + ret = tbl->point; + return ret; + } + return 0; +} + +// 0x14052C2A0 +void RobItem::s_get_offset_list(CHARA_NUM cn, uint32_t item_no, std::vector& ofs_list, bool clear) { + if (clear) + ofs_list.clear(); + + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + ofs_list.insert(ofs_list.end(), tbl->data.ofs.begin(), tbl->data.ofs.end()); +} + +// 0x14052C410 +ROB_ITEM_TYPE RobItem::s_get_type(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return tbl->type; + return ROB_ITEM_TYPE_NONE; +} + +// 0x14052C410 +bool RobItem::s_is_texorg(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return tbl->flag.m.is_texorg; + return 0; +} + +// 0x14052C3F0 +bool RobItem::s_is_objorg(CHARA_NUM cn, uint32_t item_no) { + const RobItemTable* tbl = get_rob_item_table(cn, item_no); + if (tbl) + return tbl->flag.m.is_objorg; + return 0; +} + +// 0x14052BC80 +std::string RobItem::s_check_ng_item_name(CHARA_NUM cn, uint32_t item_no) { + // NOT IMPL! + return ""; +} + +// 0x14052BD40 +int32_t RobItem::s_check_ng_item_point(CHARA_NUM cn, uint32_t item_no) { + // NOT IMPL! + return -1; +} + +// 0x1405256C0 +uint32_t RobItem::get_dbgset_num(CHARA_NUM cn) { + const RobItemHeader* tbl = get_rob_item_header(cn); + if (tbl) + return (uint32_t)tbl->dbgset.size(); + return 0; +} + +// 0x1405256A0 +const RobItemDbgSet* RobItem::get_dbgset(CHARA_NUM cn) { + const RobItemHeader* tbl = get_rob_item_header(cn); + if (tbl) + return &tbl->dbgset; + return 0; +} + +// 0x140525FC0 +void RobItem::init_have_dbg() { + if (s_have_dbg_ref) + s_have_dbg_ref++; + else { + for (int32_t i = 0; i < CN_MAX; i++) { + CHARA_NUM cn = (CHARA_NUM)i; + const RobItemHeader* tbl = get_rob_item_header(cn); + if (!tbl) + continue; + + bool found = false; + for (int32_t j = 0; j < ROB_ITEM_EQUIP_ID_MAX; j++) + if (s_have_dbg[i].part[j].item_no.size()) { + found = true; + break; + } + + if (found) + break; + + for (auto& j : tbl->table) { + ROB_ITEM_EQUIP_ID equip = s_get_equip_id(cn, j.first); + if (equip != ROB_ITEM_EQUIP_ID_NONE) + s_have_dbg[cn].part[equip].item_no.push_back(j.first); + } + } + s_have_dbg_ref = 1; + } +} + +// 0x140522000 +void RobItem::dest_have_dbg() { + if (--s_have_dbg_ref < 0) + s_have_dbg_ref = 0; + else if (!s_have_dbg_ref) + for (int32_t i = 0; i < CN_MAX; i++) + for (int32_t j = 0; j < ROB_ITEM_EQUIP_ID_MAX; j++) { + RobItemHavePart& part = s_have_dbg[i].part[j]; + part.item_no.clear(); + part.item_no.shrink_to_fit(); + } +} + +// 0x140526230 +void RobItem::init_have_sub_dbg() { + if (s_have_sub_dbg_ref) + s_have_sub_dbg_ref++; + else { + for (int32_t i = 0; i < CN_MAX; i++) { + CHARA_NUM cn = (CHARA_NUM)i; + const RobItemHeader* tbl = get_rob_item_header(cn); + if (!tbl) + continue; + + for (auto& j : tbl->table) { + const RobItemTable* tbl = get_rob_item_table(cn, j.first); + if (tbl && tbl->equip_sub_id != ROB_ITEM_EQUIP_SUB_ID_NONE) + s_have_sub_dbg[cn].part[tbl->equip_sub_id].item_no.push_back(j.first); + } + } + s_have_sub_dbg_ref = 1; + } +} + +// 0x140522070 +void RobItem::dest_have_sub_dbg() { + if (--s_have_sub_dbg_ref < 0) + s_have_sub_dbg_ref = 0; + else if (!s_have_sub_dbg_ref) + for (int32_t i = 0; i < CN_MAX; i++) + for (int32_t j = 0; j < ROB_ITEM_EQUIP_ID_MAX; j++) { + RobItemHavePart& part = s_have_sub_dbg[i].part[j]; + part.item_no.clear(); + part.item_no.shrink_to_fit(); + } +} + +// Missing +RobItemHave* RobItem::get_have_dbg(CHARA_NUM cn) { + return &s_have_dbg[cn]; +} + +// 0x140525830 +RobItemHaveSub* RobItem::get_have_sub_dbg(CHARA_NUM cn) { + return &s_have_sub_dbg[cn]; +} + +// 0x14052B0F0 +void RobItem::s_req_obj(CHARA_NUM cn, uint32_t item_no, void* data, const object_database* obj_db) { + if (!item_no) + return; + + const std::vector* item_objset = get_rob_item_table_objset(cn, item_no); + if (!item_objset) + return; + + for (uint32_t i : *item_objset) + if (i != (uint32_t)-1) + objset_info_storage_load_set(data, obj_db, i); +} + +// 0x14052D4C0 +bool RobItem::s_wait_obj(CHARA_NUM cn, uint32_t item_no) { + if (!item_no) + return false; + + const std::vector* item_objset = get_rob_item_table_objset(cn, item_no); + if (!item_objset) + return true; + + for (uint32_t i : *item_objset) + if (i != (uint32_t)-1 && objset_info_storage_load_obj_set_check_not_read(i)) + return true; + return false; +} + +// 0x140525560 +void RobItem::s_free_obj(CHARA_NUM cn, uint32_t item_no) { + if (!item_no) + return; + + const std::vector* item_objset = get_rob_item_table_objset(cn, item_no); + if (!item_objset) + return; + + for (uint32_t i : *item_objset) + if (i != (uint32_t)-1) + objset_info_storage_unload_set(i); +} + +// 0x14052B160 +void RobItem::s_req_obj_all(CHARA_NUM cn, const RobItemEquip* item_set, void* data, const object_database* obj_db) { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + s_req_obj(cn, item_set->item_no[i], data, obj_db); +} + +// 0x14052D550 +bool RobItem::s_wait_obj_all(CHARA_NUM cn, const RobItemEquip* item_set) { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + if (s_wait_obj(cn, item_set->item_no[i])) + return true; + return false; +} + +// 0x1405255D0 +void RobItem::s_free_obj_all(CHARA_NUM cn, const RobItemEquip* item_set) { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + s_free_obj(cn, item_set->item_no[i]); +} + +// 0x140521F70 +void RobItem::s_delete_item(CHARA_NUM cn, uint32_t item_no, RobItem* rob_item) { + rob_item->set_chara_num(cn); + rob_item->delete_item(item_no); +} + +// 0x14052CB40 +void RobItem::s_regist_item_one(CHARA_NUM cn, uint32_t item_no, RobItem* rob_item) { + rob_item->set_chara_num(cn); + rob_item->regist_item_one(item_no); +} + +// 0x14052CB10 +void RobItem::s_regist_item_all(CHARA_NUM cn, const RobItemEquip* item_set, RobItem* rob_item) { + rob_item->set_chara_num(cn); + rob_item->regist_item_all(item_set); +} + +RobJump::RobJump() : frame(), zvec(), next_land_frame(), land_time() { + init(); +} + +void RobJump::init() { + frame = 0.0f; + zvec = 0.0f; + next_land_frame = 0.0f; + land_time = 0.0f; +} + +RobAttack::RobAttack() : hit_timer(), flag(), ar_flag(), ar_mask(), +old_ar_flag(), old_ar_mask(), ar_flag_c(), ar_mask_c(), first_hit_result(), +cmb_first_ar_mask(), cmb_node_cnt(), next_attack_wait(), sideturn_stop_counter() { + init(); +} + +void RobAttack::init() { + hit_timer = 0; + flag.u32 = 0; + ar_flag.u32 = 0; + ar_mask.u32 = 0; + old_ar_flag.u32 = 0; + old_ar_mask.u32 = 0; + ar_flag_c.u32 = 0; + ar_mask_c.u32 = 0; + first_hit_result = false; + cmb_first_ar_mask.u32 = 0; + cmb_node_cnt = 0; + next_attack_wait = false; + sideturn_stop_counter = 0; +} + +ActParam::ActParam() : flag(), type() { } -struc_264::struc_264() : field_0(), field_4(), field_18(), field_2C(), field_40(), field_54(), field_68(), -field_6C(), field_70(), field_74(), field_78(), field_7C(), field_80(), field_84(), field_88(), field_8C(), -field_90(), field_94(), field_98(), field_9C(), field_A0(), field_A4(), field_A5(), field_A8(), field_AC(), -field_B0(), field_B4(), field_140(), field_144(), field_145(), field_146(), field_148(), field_150(), -field_152(), field_154(), field_158(), field_15C(), field_160(), field_164(), field_168(), field_16C(), -field_170(), field_174(), field_178(), field_17C(), field_180(), field_184(), field_188(), field_18C(), -field_190(), field_194(), field_198(), field_19C(), field_1A0(), kamae_type(), kamae_data(), field_1B0(), field_1B4(), -field_1B8(), field_1BC(), field_1C0(), field_1C8(), field_1C9(), field_1CA(), field_1CC(), field_1D0(), field_1D4() { +void ActParam::init() { + flag = 0; + type = 0; +} + +RobActType::RobActType() : name(), act_param(), motnum(), mirror() { } -struc_264::~struc_264() { +void RobActType::setup() { + name = ROB_ACT_NONE; + act_param.init(); + motnum = -1; + mirror = false; +} +RobGuard::RobGuard() { + init(); +} + +void RobGuard::init() { + guard_kind = GUARD_KIND_NONE; + guard_input.reset(); +} + +RobYarare::RobYarare() : get_damage(), get_power(), yarare_yang(), hit_ar_mask(), combo_count(), +combo_damage(), down_combo_count(), down_combo_damage(), down_combo_count2(), down_combo_damage2(), +down_combo_count3(), down_combo_count4(), nage_combo_count(), nage_combo_damage(), air_combo_count(), +air_combo_damage(), combo_flag(), combo_xang_offs(), max_nowall_combo_count(), max_nowall_combo_damage(), +max_wall_combo_count(), max_wall_combo_damage(), max_current_combo_count(), max_current_combo_damage(), +mot_get_damage(), real_get_damage(), orig_get_damage(), gs_resist_timer(), gs_resist_step() { + init(); +} + +RobYarare::~RobYarare() { + +} + +// 0x140506C20 +void RobYarare::init() { + get_damage = 0; + get_power = 0.0f; + yarare_yang = 0; + hit_ar_mask = {}; + efc_spd = 0.0f; + get_spd = 0.0f; + ringout_spd = 0.0f; + combo_count = 0; + combo_damage = 0; + down_combo_count = 0; + down_combo_damage = 0; + down_combo_count2 = 0; + down_combo_damage2 = 0; + down_combo_count3 = 0; + down_combo_count4 = 0; + nage_combo_count = 0; + nage_combo_damage = 0; + air_combo_count = 0; + air_combo_damage = 0; + combo_flag = 0; + combo_xang_offs = false; + field_58.clear(); + max_nowall_combo_count = 0; + max_nowall_combo_damage = 0; + max_wall_combo_count = 0; + max_wall_combo_damage = 0; + max_current_combo_count = 0; + max_current_combo_damage = 0; + mot_get_damage = 0; + real_get_damage = 0; + orig_get_damage = 0; + gs_resist_timer = 0.0f; + gs_resist_step = 0.0f; +} + +RobNage::RobNage() : disable_timer(), nagerare_cnt(), +kaeshi_damage(), enemy(), right_side(), tgt_timer() { + init(); +} + +void RobNage::init() { + disable_timer = 0.0f; + nagerare_cnt = 0; + kaeshi_damage = 0; + enemy = 0; + right_side = false; + tgt_yang = 0; + tgt_pos = 0.0f; + tgt_timer = 0.0f; +} + +RobRise::RobRise() : motnum(), hurry(), down_timer() { + init(); +} + +void RobRise::init() { + motnum = -1; + hurry = 0.0f; + down_timer = 0.0f; +} + +RobUkemi::RobUkemi() : ukemi_kind(), land_elapsed() { + init(); +} + +void RobUkemi::init() { + ukemi_kind.u32 = 0; + land_elapsed = 0.0f; +} + +RobOffensiveMove::RobOffensiveMove() : offmv_timer(), revise_grd_emy_no(), target_flag() { + init(); +} + +void RobOffensiveMove::init() { + offmv_timer = 0.0f; + revise_grd_emy_no = false; + target_pos = { 0.0f, 0.0f, 999.0f }; + target_flag.u32 = 0; +} + +RobSideTurn::RobSideTurn() : side_stop_counter(), +side_guard_disable(), side_turn_timer(), right_side_turn() { + init(); +} + +void RobSideTurn::init() { + side_stop_counter = 0.0f; + side_guard_disable = 0.0f; + side_turn_timer = 0.0f; + right_side_turn = false; +} + +RobAction::RobAction() : step(), field_B0(), field_B4(), kamae_type(), kamae_data(), +down_counter(), down_counter_ex(), old_down_counter(), mot_backup(), +gacha_count(), gacha(), drank_count(), drank_add_req(), wall_yoroke_timer() { + +} + +RobAction::~RobAction() { + +} + +// 0x140505C90 +void RobAction::init() { + step = 0; + action.setup(); + old_action.setup(); + command.setup(); + bak_command.setup(); + sys_command.setup(); + jump.init(); + attack.init(); + guard.init(); + field_B0 = 0; + field_B4 = false; + yarare.init(); + nage.init(); + rise.init(); + ukemi.init(); + off_move.init(); + side_turn.init(); + kamae_type = 0; + kamae_data = 0; + down_counter = 0.0f; + down_counter_ex = 0.0f; + old_down_counter = 0.0f; + mot_backup = -1; + kaeshi_flag.reset(); + gacha_count = 0; + gacha = false; + drank_count = 0; + drank_add_req = 0; + wall_yoroke_timer = 0.0f; } SubActParam::SubActParam(SubActParamType type) { @@ -15415,20 +16192,20 @@ SubActExecAngry::~SubActExecAngry() { }; -void SubActExecAngry::Field_8() { +void SubActExecAngry::init() { type = SUB_ACTION_EXECUTE_ANGRY; field_C = 0; }; -void SubActExecAngry::Field_10(SubActParam* param) { - Field_8(); +void SubActExecAngry::set(const SubActParam* param) { + init(); }; -void SubActExecAngry::Field_18(rob_chara* rob_chr) { - rob_chr->data.rob_sub_action.data.field_8 = this; +void SubActExecAngry::Field_18(rob_chara* impl) { + impl->rob_base.sub_action.field_10 = this; }; -void SubActExecAngry::Field_20(rob_chara* rob_chr) { +void SubActExecAngry::Field_20(rob_chara* impl) { }; @@ -15442,7 +16219,7 @@ SubActExecCountNum::~SubActExecCountNum() { }; -void SubActExecCountNum::Field_8() { +void SubActExecCountNum::init() { type = SUB_ACTION_EXECUTE_COUNT_NUM; field_C = 0; field_10 = 0; @@ -15450,20 +16227,21 @@ void SubActExecCountNum::Field_8() { field_18 = 0; }; -void SubActExecCountNum::Field_10(SubActParam* param) { - Field_8(); +void SubActExecCountNum::set(const SubActParam* param) { + init(); + if (param) { - SubActParamCountNum* param_count_num = dynamic_cast(param); + const SubActParamCountNum* param_count_num = dynamic_cast(param); if (param_count_num) field_10 = param_count_num->field_10; } }; -void SubActExecCountNum::Field_18(rob_chara* rob_chr) { - rob_chr->data.rob_sub_action.data.field_8 = this; +void SubActExecCountNum::Field_18(rob_chara* impl) { + impl->rob_base.sub_action.field_10 = this; }; -void SubActExecCountNum::Field_20(rob_chara* rob_chr) { +void SubActExecCountNum::Field_20(rob_chara* impl) { }; @@ -15475,20 +16253,20 @@ SubActExecCry::~SubActExecCry() { }; -void SubActExecCry::Field_8() { +void SubActExecCry::init() { type = SUB_ACTION_EXECUTE_CRY; field_C = 0; }; -void SubActExecCry::Field_10(SubActParam* param) { - Field_8(); +void SubActExecCry::set(const SubActParam* param) { + init(); }; -void SubActExecCry::Field_18(rob_chara* rob_chr) { - rob_chr->data.rob_sub_action.data.field_8 = this; +void SubActExecCry::Field_18(rob_chara* impl) { + impl->rob_base.sub_action.field_10 = this; }; -void SubActExecCry::Field_20(rob_chara* rob_chr) { +void SubActExecCry::Field_20(rob_chara* impl) { }; @@ -15500,21 +16278,21 @@ SubActExecEmbarrassed::~SubActExecEmbarrassed() { }; -void SubActExecEmbarrassed::Field_8() { +void SubActExecEmbarrassed::init() { type = SUB_ACTION_EXECUTE_EMBARRASSED; field_C = 0; field_10 = 0; }; -void SubActExecEmbarrassed::Field_10(SubActParam* param) { - Field_8(); +void SubActExecEmbarrassed::set(const SubActParam* param) { + init(); }; -void SubActExecEmbarrassed::Field_18(rob_chara* rob_chr) { - rob_chr->data.rob_sub_action.data.field_8 = this; +void SubActExecEmbarrassed::Field_18(rob_chara* impl) { + impl->rob_base.sub_action.field_10 = this; }; -void SubActExecEmbarrassed::Field_20(rob_chara* rob_chr) { +void SubActExecEmbarrassed::Field_20(rob_chara* impl) { }; @@ -15526,20 +16304,20 @@ SubActExecLaugh::~SubActExecLaugh() { }; -void SubActExecLaugh::Field_8() { +void SubActExecLaugh::init() { type = SUB_ACTION_EXECUTE_LAUGH; field_C = 0; }; -void SubActExecLaugh::Field_10(SubActParam* param) { - Field_8(); +void SubActExecLaugh::set(const SubActParam* param) { + init(); }; -void SubActExecLaugh::Field_18(rob_chara* rob_chr) { - rob_chr->data.rob_sub_action.data.field_8 = this; +void SubActExecLaugh::Field_18(rob_chara* impl) { + impl->rob_base.sub_action.field_10 = this; }; -void SubActExecLaugh::Field_20(rob_chara* rob_chr) { +void SubActExecLaugh::Field_20(rob_chara* impl) { }; @@ -15553,7 +16331,7 @@ SubActExecShakeHand::~SubActExecShakeHand() { }; -void SubActExecShakeHand::Field_8() { +void SubActExecShakeHand::init() { type = SUB_ACTION_EXECUTE_SHAKE_HAND; field_C = 0; field_10 = 0; @@ -15561,60 +16339,68 @@ void SubActExecShakeHand::Field_8() { field_18 = 0; }; -void SubActExecShakeHand::Field_10(SubActParam* param) { - Field_8(); +void SubActExecShakeHand::set(const SubActParam* param) { + init(); + if (param) { - SubActParamShakeHand* param_shake_hand = dynamic_cast(param); + const SubActParamShakeHand* param_shake_hand = dynamic_cast(param); if (param_shake_hand) field_10 = param_shake_hand->field_10; } }; -void SubActExecShakeHand::Field_18(rob_chara* rob_chr) { - rob_chr->data.rob_sub_action.data.field_8 = this; +void SubActExecShakeHand::Field_18(rob_chara* impl) { + impl->rob_base.sub_action.field_10 = this; }; -void SubActExecShakeHand::Field_20(rob_chara* rob_chr) { +void SubActExecShakeHand::Field_20(rob_chara* impl) { }; -RobSubAction::Data::Data() : field_0(), field_8(), param(), field_18() { - -} - -RobSubAction::Data::~Data() { - -} - -RobSubAction::RobSubAction() { - Reset(); +RobSubAction::RobSubAction() : field_8(), field_10(), param(), field_20() { + init(); } RobSubAction::~RobSubAction() { - Reset(); + dest(); } -void RobSubAction::Reset() { - data.field_0 = 0; - data.field_8 = 0; - data.param = 0; - data.field_18 = 0; - data.cry.Field_8(); - data.shake_hand.Field_8(); - data.embarrassed.Field_8(); - data.angry.Field_8(); - data.laugh.Field_8(); +void RobSubAction::dest() { + field_8 = 0; + field_10 = 0; + + if (param) { + delete param; + param = 0; + } + + if (field_20) { + delete field_20; + field_20 = 0; + } } -void RobSubAction::SetSubActParam(SubActParam* value) { +void RobSubAction::init() { + field_8 = 0; + field_10 = 0; + param = 0; + field_20 = 0; + cry.init(); + shake_hand.init(); + embarrassed.init(); + angry.init(); + laugh.init(); +} + +void RobSubAction::set(SubActParam* value) { if (!value) return; - if (data.param) { - delete data.param; - data.param = 0; + if (param) { + delete param; + param = 0; } - data.param = value; + param = value; } RobPartialMotion::RobPartialMotion() { @@ -15631,7 +16417,7 @@ bool RobPartialMotion::CheckEnded() { return false; if (CheckPlaybackStateForward()) { - if (data.loop_state >= ROB_PARTIAL_MOTION_LOOP_MAX && (data.frame_count - 1.0f) < data.frame) + if (data.loop_state >= ROB_PARTIAL_MOTION_LOOP_MAX && (data.frame_max - 1.0f) < data.frame) return true; } else if (CheckPlaybackStateBackward()) { @@ -15679,11 +16465,11 @@ void RobPartialMotion::GetFrameStep() { if (!CheckPlaybackStateCharaMotion()) return; - if (data.frame_data) - data.frame = data.frame_data->frame; + if (data.frame_ptr) + data.frame = data.frame_ptr->f; - if (data.step_data) - data.step = data.step_data->frame; + if (data.step_ptr) + data.step = data.step_ptr->f; } // 0x14053F300 @@ -15693,7 +16479,7 @@ void RobPartialMotion::Step() { if (CheckPlaybackStateForward()) { float_t frame = data.frame + data.step; - float_t last_frame = data.frame_count - 1.0f; + float_t last_frame = data.frame_max - 1.0f; switch (data.loop_state) { case ROB_PARTIAL_MOTION_LOOP_ONCE: if (frame > last_frame) @@ -15718,7 +16504,7 @@ void RobPartialMotion::Step() { } else if (CheckPlaybackStateBackward()) { float_t frame = data.frame - data.step; - float_t last_frame = data.frame_count - 1.0f; + float_t last_frame = data.frame_max - 1.0f; switch (data.loop_state) { case ROB_PARTIAL_MOTION_LOOP_ONCE: if (frame < 0.0f) @@ -15746,10 +16532,10 @@ void RobPartialMotion::Step() { data.play_duration -= data.step; } else if (CheckPlaybackStateCharaMotion()) { - if (data.frame_data) - data.frame = data.frame_data->frame; - if (data.step_data) - data.step = data.step_data->frame; + if (data.frame_ptr) + data.frame = data.frame_ptr->f; + if (data.step_ptr) + data.step = data.step_ptr->f; } } @@ -15814,7 +16600,7 @@ void RobEyelidMotion::Reset() { } rob_chara_data_adjust::rob_chara_data_adjust() : enable(), frame(), transition_frame(), -curr_force(), curr_strength(), motion_id(), set_frame(), transition_duration(), type(), +curr_force(), curr_strength(), motnum(), set_frame(), transition_duration(), type(), cycle_type(), ignore_gravity(), cycle(), phase(), force(), strength(), strength_transition() { reset(); } @@ -15826,7 +16612,7 @@ void rob_chara_data_adjust::reset() { curr_ex_force = 0.0f; curr_force = 1.0f; curr_strength = 1.0f; - motion_id = -1; + motnum = -1; set_frame = 0.0f; transition_duration = 0.0f; type = 6; @@ -15844,7 +16630,7 @@ void rob_chara_data_adjust::reset() { rob_chara_data_hand_adjust::rob_chara_data_hand_adjust() : enable(), scale_select(), type(), current_scale(), scale(), duration(), current_time(), rotation_blend(), scale_blend(), -enable_scale(), disable_x(), disable_y(), disable_z(), arm_length(), iterations() { +enable_scale(), disable_x(), disable_y(), disable_z(), arm_length(), init_cnt() { reset(); } @@ -15865,7 +16651,7 @@ void rob_chara_data_hand_adjust::reset() { offset = 0.0f; target = 0.0f; arm_length = 0.0f; - iterations = 0; + init_cnt = 0; } void rob_chara_data_arm_adjust::reset() { @@ -15877,46 +16663,43 @@ void rob_chara_data_arm_adjust::reset() { frame = 0.0f; } -rob_chara_motion::rob_chara_motion() : frame_data(), step_data(), field_24(), field_28(), field_29(), -field_2A(), loop_index(), field_30(), field_34(), field_36(), field_38(), field_B8(), -field_138(), field_13C(), field_140(), field_14C(), field_314(), parts_adjust(), parts_adjust_prev(), -adjust_global(), adjust_global_prev(), hand_adjust(), hand_adjust_prev(), arm_adjust() { - motion_id = -1; - prev_motion_id = -1; - step = 1.0f; +RobMotion::RobMotion() : frame(), step(), basic_step(), flag(), repeat_count(), same_mot_idx(), same_count(), +field_38(), field_B8(), mot_adjust_scale(), mot_xz_adjust_scale(), face_motnum(), parts_adjust(), +parts_adjust_prev(), adjust_global(), adjust_global_prev(), hand_adjust(), hand_adjust_prev(), arm_adjust() { + num = -1; + old_num = -1; + osage_step = 1.0f; } -rob_chara_motion::~rob_chara_motion() { +RobMotion::~RobMotion() { } -void rob_chara_motion::reset() { - motion_id = -1; - prev_motion_id = -1; - frame_data.frame = 0.0f; - frame_data.prev_frame = 0.0f; - frame_data.last_set_frame = 0.0f; - step_data.frame = 0.0f; - step_data.field_4 = 0.0f; - step_data.step = -1.0f; - step = -1.0f; - field_24 = 0; - field_28 = 0; - field_29 = 0; - field_2A = 0; - loop_index = 0; - field_30 = 0; - field_34 = 0; - field_36 = 0; +void RobMotion::reset() { + num = -1; + old_num = -1; + frame.f = 0.0f; + frame.old_f = 0.0f; + frame.req_f = 0.0f; + step.f = 0.0f; + step.old_f = 0.0f; + step.req_f = -1.0f; + osage_step = -1.0f; + basic_step = BSTEP_BEGIN; + flag.u32 = 0; + repeat_count = 0; + shift_req.reset(); + same_mot_idx = 0; + same_count = 0; for (int32_t& i : field_38) i = 0; for (int32_t& i : field_B8) i = 0; - field_138 = 1.0f; - field_13C = 1.0f; - field_140 = 0.0f; + mot_adjust_scale = 1.0f; + mot_xz_adjust_scale = 1.0f; + mot_adjust_base_pos = 0.0f; field_150.Reset(); hand_l.Reset(); hand_r.Reset(); @@ -15943,251 +16726,294 @@ void rob_chara_motion::reset() { i.reset(); } -mothead_mot::mothead_mot() { - field_0.field_0 = 19; - field_0.field_4 = 0; - field_0.field_8 = 0; - field_0.field_C = 0; - field_10 = 0x04; - field_12 = 0x04; - mot_data = 0; - data = 0; - field_28 = 0; -} - -mothead::mothead() { - mot_set_id = -1; - first_mot_id = 0; - last_mot_id = 0; - mots = 0; -} - -struc_306::struc_306() : field_0(), frame(), field_8(), field_C(), field_E(), -field_34(), field_38(), field_3C(), field_40(), field_44(), field_48() { +CtrlDMot::CtrlDMot() : mot_id(-1), mot_flag() { } -struc_306::struc_306(int16_t field_0, float_t frame, float_t field_8) : field_0(field_0), -frame(frame), field_8(field_8), field_C(), field_E(), -field_34(), field_38(), field_3C(), field_40(), field_44(), field_48() { +RobMotId::RobMotId() { } -struc_652::struc_652() : motion_id(), frame_count(), frame(), field_C(), field_10(), field_20(), -field_30(), field_40(), field_50(), field_52(), field_54(), field_58(), field_5C(), field_60(), -field_64(), field_68(), loop_count(), loop_begin(), loop_end(), field_78(), field_7C(), field_80(), -field_84(), field_88(), field_8C(), field_90(), field_94(), field_96(), field_98(), field_9C(), -field_A0(), field_A4(), field_A8(), field_B0(), field_1E8(), field_1EC(), field_1F0(), field_1F4(), -field_1F8(), field_1FC(), field_200(), field_204(), field_208(), field_20C(), field_210(), field_218(), -field_21C(), field_220(), field_238(), field_23C(), field_240(), field_244(), field_248(), field_250(), -field_258(), field_25C(), field_260(), field_268(), field_270(), field_274(), field_276(), field_278(), -field_27C(), field_280(), field_284(), field_288(), field_290(), field_294(), field_298(), field_29C(), -field_2A0(), field_2A4(), field_2A8(), field_2AC(), field_2B0(), field_2B8(), field_2BC(), field_2C0(), -field_2C4(), field_2C8(), field_2CC(), field_2D0(), field_2D8(), field_2E0(), field_2E8(), field_2EC(), -field_2F0(), field_2F4(), field_2F8(), field_2FC(), field_300(), field_304(), field_308(), field_30C(), -field_310(), field_314(), field_318(), field_324(), field_328(), iterations() { +void RobMotId::clear() { + mot_id = -1; + mot_flag = 0; +} + +void RobMotId::set(uint32_t in_mot_id, uint32_t in_mot_flag) { + mot_id = in_mot_id; + mot_flag = in_mot_flag; +} + +RobMotDAs::RobMotDAs() : count(), follow2(), nagerenai() { } -struc_652::~struc_652() { +void RobMotDAs::clear() { + count = 0.0f; + follow2 = -1.0f; + nagerenai = -1.0f; +} + +MhdData::MhdData() { + mot_kind.mhk_kind[0] = 19; + mot_kind.mhk_kind[1] = 0; + mot_kind.mhk_kind[2] = 0; + mot_kind.mhk_kind[3] = 0; + start_style = 0x04; + end_style = 0x04; + mh_list = 0; + pp_list = 0; + cm_list = 0; +} + +MhdFileHeader::MhdFileHeader() { + file_id = -1; + min_mot_id = 0; + max_mot_id= 0; + data_list = 0; +} + +RobTarget::RobTarget() : target_flag(), target_end() { } -void struc_652::reset() { - motion_id = -1; - frame_count = 0.0f; - frame = 0.0f; - field_C = 0; - sub_140536DD0(); - field_50 = 0; - field_52 = 0; - field_54 = 0; - field_58 = -1; - field_5C = -1; - field_60 = 0; - field_64 = -1; - field_68 = 0; - loop_count = -1; - loop_begin = 0.0f; - loop_end = -1.0f; - field_78 = 0.0f; - field_7C = 0.0f; - field_80 = 0.0f; - field_1E8 = 0; - field_1EC = 0.0f; - field_1F0 = 0.0f; - field_1F4 = 0.0f; - field_1F8 = -1.0f; - field_1FC = 0.0f; - field_200 = 1.0f; - field_204 = -1; - field_208 = 0; - field_20C = -1; - field_210 = 0; - field_218 = -1.0f; - field_21C = -1.0f; - field_220 = 0; - field_228.clear(); - field_238 = -1; - field_23C = 0.0f; - field_240 = 0; - field_244 = 0; - field_248 = 0; - field_250 = 0; - field_258 = -1.0f; - field_25C = 0; - field_268 = 0; - field_274 = 0; - field_278 = 0; - field_27C = -1; - field_280 = 0; - field_284 = 0; - field_288 = 0; - field_290 = 0; - field_294 = 0; - field_298 = 0; - field_29C = 0.0f; - field_2A0 = 0; - field_2A4 = 0.0f; - field_2A8 = 0.0f; - field_2AC = 0.0f; - field_2B8 = 0; - field_2BC = 0; - field_2C0 = -1.0f; - field_2C4 = -1.0f; - field_2C8 = 0; - field_2E8 = -1; - field_2EC = 0; - field_2F0 = 0; - field_2F4 = 0; - field_2FC = -1; - field_300 = 100; - field_304 = 1; - field_308 = 0; - field_30C = 1.0f; - field_318 = 0.0f; - field_324 = 0.05f; - field_328 = -1.0f; - iterations = -1; -} - -void struc_652::sub_140536DD0() { - field_84 = 0; - field_88 = 0; - field_8C = 0; - field_90 = 0; - field_94 = 0; - field_96 = 0; - field_98 = -1; - field_9C = 0; - field_A0 = 0; - field_A4 = 0; - field_A8 = 0; - field_B0[0] = { 0, 1.2f, 1.0f }; - field_B0[1] = { 0, -1.0f, -1.0f }; - field_B0[2] = { 0, -1.0f, -1.0f }; - field_B0[3] = { 0, -1.0f, -1.0f }; - field_B0[4] = { 0, -1.0f, -1.0f }; - field_B0[5] = { 0, -1.0f, -1.0f }; - field_B0[6] = { 0, -1.0f, -1.0f }; - field_B0[7] = { 0, -1.0f, -1.0f }; - field_B0[8] = { 0, -1.0f, -1.0f }; - field_B0[9] = { 0, -1.0f, -1.0f }; - field_B0[10] = { 0, -1.0f, -1.0f }; - field_B0[11] = { 0, -1.0f, -1.0f }; - field_B0[12] = { 0, -1.0f, -1.0f }; - field_B0[13] = { 0, -1.0f, -1.0f }; - field_B0[14] = { 0, -1.0f, -1.0f }; - field_B0[15] = { 0, -1.0f, -1.0f }; - field_B0[16] = { 0, -1.0f, -1.0f }; - field_B0[17] = { 0, -1.0f, -1.0f }; - field_B0[18] = { 0, -1.0f, -1.0f }; - field_B0[19] = { 0, -1.0f, -1.0f }; - field_B0[20] = { 0, -1.0f, -1.0f }; - field_B0[21] = { 0, -1.0f, -1.0f }; - field_B0[22] = { 0, -1.0f, -1.0f }; - field_B0[23] = { 0, -1.0f, -1.0f }; - field_B0[24] = { 0, -1.0f, -1.0f }; - field_B0[25] = { 0, -1.0f, -1.0f }; - field_260 = 0; - field_270 = 0; - field_2B0 = 0; - field_2D8 = field_2D0; - field_310 = 3; - field_314 = 0; -} - -struc_651::struc_651() : field_0(), field_10(), field_14(), field_18(), field_1C(), field_2C(), -field_80(), field_1C4(), field_308(), arm_adjust_next_value(), arm_adjust_prev_value(), -arm_adjust_start_frame(), arm_adjust_duration(), field_310(), field_314(), field_318(), field_31C(), -field_320(), field_324(), field_328(), field_32C(), field_330(), field_334(), field_338() { +MotLeafCtrl::MotLeafCtrl() : mode(), start_frame(), end_frame(), target_id(), limit() { } -void struc_651::reset() { - field_0.current = 0; - field_0.data = 0; - field_10 = 0; - field_14 = 0; - field_18 = 0; - field_1C = 0.0f; - field_20 = 0.0f; +MotLeafCtrl::MotLeafCtrl(int16_t mode, float_t start_frame, float_t end_frame) : mode(mode), +start_frame(start_frame), end_frame(end_frame), target_id(), limit() { - for (struc_226& i : field_2C) - for (int8_t& j : i.field_0) - j = 0; +} - for (struc_225& i : field_80) - for (float_t& j : i.field_0) - j = 1.0f; +RobMotData::RobMotData() : mot(), frame_max(), frame(), ex_damage_all(), start_style(), end_style(), +end_style_flag(), next_type(), next_limit(), loop_begin(), loop_end(), main_mot_frame(), +follow1_frame(), follow2_frame(), attack_flag(), attack_kind(), attack_unit(), attack_point(), +original_damage(), attack_damage(), dist_min_damage(), dc_type(), yarare_type(), efc_spd(), +attack_ball_multi(), down_attack_multi(), air_kind(), jump_frame(), stop_frame(), land_frame(), ev_land_frame(), +land_ypos(), gravity(), nagerare_mot(), nagerare_mot_mirror(), nage_ringout_frame(), nage_cancel_frame(), +nage_kabe_follow2(), nage_damage(), tag_jumph(), tag_xofs(), tag_zofs(), shift_num(), shift_adr(), +ukemi_start_ofs_frame(), ukemi_end_frame(), ukemi_exec_frame(), ukemi_flag(), kaesare_type(), kaeseru_type(), +kaesare_attrib(), gacha_flag(), gacha_times(), gacha_frame(), guard_type(), guard_frame(), frame_ctrl_type(), +frame_ctrl_frame(), frame_ctrl_tag_type(), frame_ctrl_tag_add(), frame_ctrl_min(), frame_ctrl_max(), +est_adr(), dturn_yang(), smooth_flag(), smooth_f_length(), smooth_r_length(), ride_on_ypos(), atk_snd_list(), +kabe_damage(), kabe_damage_type(), resist_low_limit(), resist_max_limit(), resist_percent(), resist_down_chk(), +resist_slow_frame(), resist_slow_step(), en_drink_off_type(), en_drink_off_dec(), trans_xofs(), trans_yofs(), +trans_zofs(), jump_zspd(), wall_haritsuki_frame(), init_cnt(), play_prog(), play_prog_org(), rob_cam_flag(), +colliball_flag(), colliball_ratio(), colliball_timer(), mot_adjust_start(), mot_adjust_end(), mot_adjust_flag(), +mot_adjust_type(), mot_adjust_scale(), pre_adjust_scale(), mot_adjust_base_ypos(), pre_adjust_base_ypos(), +atk2_start_frame(), atk2_end_frame(), atk2_set_flag(), mh_command(), mh_did() { + clear(); +} - for (struc_224& i : field_1C4) - for (float_t& j : i.field_0) +RobMotData::~RobMotData() { + clear(); +} + +void RobMotData::clear() { + motkind_fix = {}; + motkind = {}; + mhd_smd_clear(); + mhd_pp_clear(); + mh_command = 0; + mh_did = -1; +} + +// 0x1405335C0 +void RobMotData::mhd_pp_clear() { + play_prog = 0; + play_prog_org = 0; + revise_flag.reset(); + rob_cam_flag = 0; + + target.target_flag = ROB_TARGET_NONE; + target.target_end = 0.0f; + target.target_pos = 0.0f; + + for (auto& i : colliball_flag) + for (auto& j : i) + j = false; + + for (auto& i : colliball_ratio) + for (auto& j : i) + j = 0.0f; + + for (auto& i : colliball_timer) + for (auto& j : i) j = 0.0f; - field_308 = 0; arm_adjust_next_value = 0.0f; // X arm_adjust_prev_value = 0.0f; // X arm_adjust_start_frame = -1; // X arm_adjust_duration = -1.0f; // X - field_310 = -1.0f; - field_314 = -1.0f; - field_318 = 0; - field_31C = 0; - field_320 = 1.0f; - field_324 = 1.0f; - field_32C = 0; - field_330 = -1.0f; - field_334 = -1.0f; - field_338 = 0; - field_33C[0] = { -1, -1.0f, -1.0f }; - field_33C[1] = { -1, -1.0f, -1.0f }; - field_33C[2] = { -1, -1.0f, -1.0f }; - field_33C[3] = { -1, -1.0f, -1.0f }; + + mot_adjust_start = -1.0f; + mot_adjust_end = -1.0f; + mot_adjust_flag = 0; + mot_adjust_type = MA_TYPE_NONE; + mot_adjust_scale = 1.0f; + pre_adjust_scale = 1.0f; + mot_adjust_base_ypos = 0.0f; + pre_adjust_base_ypos = 0.0f; + + atk2_start_frame = -1.0f; + atk2_end_frame = -1.0f; + atk2_set_flag = false; + + for (MotLeafCtrl& i : leaf_ctrl) + i = { -1, -1.0f, -1.0f }; } -struc_223::struc_223() : field_330(), field_7A0(), motion_set_id() { +// 0x1405338F0 +void RobMotData::mhd_pp_exec(rob_chara* impl, float_t frame, const motion_database* mot_db) { + atk2_set_flag = false; + if (!play_prog) + return; + + RobMhPp pp; + pp.impl = impl; + pp.base = &impl->rob_base; + pp.base_emy = impl->enemy ? &impl->enemy->rob_base : 0; + pp.smd_class.impl = impl; + pp.smd_class.base = &impl->rob_base; + pp.smd_class.motd = &impl->rob_base.motdata; + + int32_t frame_int = (int32_t)frame; + while (play_prog->frame <= frame_int && play_prog->type >= 0) { + pp.exec_func(play_prog->type, play_prog, frame_int, mot_db); + play_prog++; + } } -struc_223::~struc_223() { - +// 0x140536DD0 +void RobMotData::mhd_smd_atk_clear() { + attack_flag = false; + attack_kind.reset(); + attack_unit = AU_NO_ATTACK; + attack_point = AP_NO_ATTACK; + original_damage = 0; + attack_damage = 0; + dist_min_damage = -1; + dc_type.reset(); + efc_yang = 0; + yarare_type = E_PUNCH; + efc_flag.reset(); + efc_spd = EST_NORMAL; + attack_ball_multi = 1.2f; + down_attack_multi = 1.0f; + for (RobMotDAs& i : field_B8) + i.clear(); + kaesare_type.reset(); + kaesare_attrib = KT_ATTRIB_NONE; + est_adr = 0; + atk_snd_list.clear(); + en_drink_off_type = MH_EDRK_DRINK_OFF_MAX; + en_drink_off_dec = 0; } -void struc_223::reset() { - field_0.field_10 = {}; - field_0.field_20 = {}; - field_0.reset(); - field_330.reset(); - field_7A0 = 0; - motion_set_id = -1; +// 0x140537110 +void RobMotData::mhd_smd_clear() { + mot = -1; + frame_max = 0.0f; + frame = 0.0f; + ex_damage_all = 0; + mhd_smd_atk_clear(); + start_style = 0; + end_style = 0; + end_style_flag = 0; + next_type = MH_NEXT_NONE; + next.clear(); + next_end.clear(); + next_limit = -1; + loop_begin = 0.0f; + loop_end = -1.0f; + main_mot_frame = 0.0f; + follow1_frame = 0.0f; + follow2_frame = 0.0f; + air_kind.reset(); + jump_frame = 0.0f; + stop_frame = 0.0f; + land_frame = 0.0f; + ev_land_frame = -1.0f; + land_ypos = 0.0f; + gravity = 1.0f; + nagerare_mot.clear(); + nagerare_mot_mirror.clear(); + nage_ringout_frame = 0.0f; + nage_cancel_frame = -1.0f; + nage_kabe_follow2 = -1.0f; + nage_damage = 0; + nage_nuke_list.clear(); + tag_jumph = -1; + tag_xofs = 0.0f; + tag_zofs = 0.0f; + shift_num = 0; + shift_adr = 0; + ukemi_start_ofs_frame = 0.0f; + ukemi_end_frame = 0.0f; + ukemi_exec_frame = -1.0f; + ukemi_flag = 0; + kaeseru_type.reset(); + mov_yang = 0; + old_mov_yang = 0; + gacha_flag.reset(); + gacha_mot.clear(); + gacha_times = 0; + gacha_frame = 0.0f; + guard_type = GK_TYPE_ALL; + guard_flag.reset(); + guard_frame = 0.0f; + frame_ctrl_type = 0; + frame_ctrl_frame = 0.0f; + frame_ctrl_tag_type = 0; + frame_ctrl_tag_add = 0.0f; + frame_ctrl_min = 0.0f; + frame_ctrl_max = 0.0f; + dturn_yang = 0; + smooth_flag.reset(); + smooth_f_length = -1.0f; + smooth_r_length = -1.0f; + ride_on_ypos = 0.0f; + kabe_damage = -1; + kabe_damage_type = MH_KBD_NORMAL; + nagereru_char.reset(); + resist_type.reset(); + resist_low_limit = -1; + resist_max_limit = -1; + resist_percent = 100; + resist_down_chk = RESIST_CHK_DOWN; + resist_slow_frame = 0.0f; + resist_slow_step = 1.0f; + trans_xofs = 0.0f; + trans_yofs = 0.0f; + trans_zofs = 0.0f; + jump_zspd = 0.05f; + wall_haritsuki_frame = -1.0f; + init_cnt = -1; } -rob_chara_data_miku_rot::rob_chara_data_miku_rot() : revise_type(), ground_pos(), ground_last() { +// 0x140537380 +void RobMotData::mhd_smd_exec(rob_chara* impl, MhdList* list) { + if (!list || !list->data) + return; + + RobMhSmd smd; + smd.impl = impl; + smd.base = &impl->rob_base; + smd.motd = &impl->rob_base.motdata; + + while (list->data && list->type >= 0) { + smd.exec_func(list->type, list); + list++; + } +} + +RobPosition::RobPosition() : revise_type(), ground_pos(), ground_last() { reset(); } -void rob_chara_data_miku_rot::reset() { +void RobPosition::reset() { yang = 0; act_yang = 0; hara_xang = 0; @@ -16207,13 +17033,13 @@ void rob_chara_data_miku_rot::reset() { rob_mat = mat4_identity; } -rob_chara_adjust_data::rob_chara_adjust_data() : scale(), height_adjust(), pos_adjust_y(), +RobAdjust::RobAdjust() : scale(), height_adjust(), pos_adjust_y(), offset_x(), offset_y(), offset_z(), get_global_pos(), left_hand_scale(), right_hand_scale(), left_hand_scale_default(), right_hand_scale_default(), item_scale() { reset(); } -void rob_chara_adjust_data::reset() { +void RobAdjust::reset() { scale = 1.0f; height_adjust = false; pos_adjust_y = 0.0f; @@ -16232,7 +17058,11 @@ void rob_chara_adjust_data::reset() { item_scale = 1.0f; // X } -struc_195::struc_195() : scale(), field_1C(), field_20(), field_24() { +prj::Sphere3f::Sphere3f() : r() { + +} + +prj::BallCollision::BallCollision() : sink(), colli_ball_mask(), org_rad() { } @@ -16270,157 +17100,234 @@ float_t pos_scale::get_screen_pos_scale(const mat4& mat, } } -struc_209::struc_209() : field_0(), field_4(), field_8(), field_C(), field_10(), field_14(), field_18(), -field_1C(), field_20(), field_24(), field_28(), field_2C(), field_30(), field_34(), field_38(), field_3C(), -field_40(), field_44(), field_48(), field_4C(), field_50(), field_54(), field_58(), field_5C(), field_60(), -field_64(), field_68(), field_6C(), field_70(), field_74(), field_78(), field_738(), field_DF8(), field_1230(), -field_1668(), field_1AA0(), field_1BE4(), field_1C68(), field_1C70(), field_1C78(), field_1C80(), field_1C88(), -field_1CF4(), field_1D60(), field_1DCC(), field_1DD0(), field_1DD4(), field_1DD8(), field_1DDC(), field_1DE0(), -field_1DE4(), field_1DE8(), field_1DEC(), field_1DF0(), field_1DF4(), field_1DF8(), field_1DFC(), field_1E00(), -field_1E04(), field_1E08(), field_1E0C(), field_1E10(), field_1E14(), field_1E18(), field_1E1C(), field_1E20(), -field_1E24(), field_1E28(), field_1E2C(), field_1E30(), field_1E34(), field_1E38(), field_1E3C(), field_1E40(), -field_1E44(), field_1E48(), field_1E4C(), field_1E50(), field_1E54(), field_1E58(), field_1E5C(), field_1E60(), -field_1E64(), field_1E68(), field_1E6C(), field_1E70(), field_1E74(), field_1E78(), field_1E7C(), field_1E80(), -field_1E84(), field_1E88(), field_1E8C(), field_1E90(), field_1E94(), field_1E98(), field_1E9C(), -field_1EA0(), field_1EA4(), field_1EA8(), field_1EAC(), field_1EB0(), field_1EB4(), field_1EF4(), -field_1F04(), field_1F08(), field_1F0C(), field_1F10(), field_1F14(), field_1F18(), field_1F1C(), -field_1F20(), field_1F21(), field_1F22(), field_1F23(), field_1F24(), field_1F25(), field_1F26() { +RobColliWall::RobColliWall() : wdist(), wheight() { } -struc_209::~struc_209() { +void RobColliWall::setup() { + wdist = 1000.0f; + wang.set_rad(0.5f); + wheight = -1.0f; + wyang.set_rad(0.0f); +} + +RobCollision::RobCollision() : touch_count(), wall_touch_cnt(), touch_mask(), attack_mask(), hit_mask(), +damage_mask(), check_wall(), wall_hit_num(), wall_hit_mask(), handrail_hit_num(), handrail_hit_mask(), +dummy_wall_hit_num(), dummy_wall_hit_mask(), dummy_ringout_num(), dummy_ringout_mask(), above_floor_num(), +above_floor_mask(), floor_hit_num(), floor_hit_mask(), ringout_num(), ringout_mask(), ringout_air_num(), +ringout_air_mask(), sink_floor(), floor_idx(), fld_on(), sink_wall(), wall_idx(), field_1AA0(), +field_1BE4(), field_1C68(), field_1C70(), field_1C78(), field_1C80(), field_1C88(), field_1CF4(), +field_1D60(), field_1DCC(), field_1DD0(), field_1DD4(), field_1DD8(), sink(), max_ypos(), +min_ypos(), max_idx(), min_idx(), top_ypos(), bot_ypos(), top_idx(), bot_idx(), wall_info(), +ringout_dist(), init_thrust_vec_req(), req_wall_break(), enable_dummy_collision(), +fall_ringout(), req_kabe_yoroke(), calc_rob_colli(), colli_attack_hit(), floor_ringout_disable() { } -rob_chara_data::rob_chara_data() : flag(), -adjust_data(), field_3D90(), field_3D94(), field_3D98(), field_3D9A(), field_3D9C(), field_3DA0(), -field_3DA4(), field_3DA8(), field_3DB0(), field_3DB8(), field_3DBC(), field_3DC0(), field_3DC4(), field_3DC8(), -field_3DCC(), field_3DD0(), field_3DD4(), field_3DD8(), field_3DDC(), field_3DE0(), arm_adjust_scale() { +RobCollision::~RobCollision() { } -rob_chara_data::~rob_chara_data() { +// 0x140505FB0 +void RobCollision::init() { + touch_count = 0; + wall_touch_cnt = 0; + touch_mask = 0; + attack_mask = 0; + hit_mask = 0; + damage_mask = 0; + check_wall = 0; + wall_hit_num = 0; + wall_hit_mask = 0; + handrail_hit_num = 0; + handrail_hit_mask = 0; + dummy_wall_hit_num = 0; + dummy_wall_hit_mask = 0; + dummy_ringout_num = 0; + dummy_ringout_mask = 0; + above_floor_num = 0; + above_floor_mask = 0; + floor_hit_num = 0; + floor_hit_mask = 0; + ringout_num = 0; + ringout_mask = 0; + ringout_air_num = 0; + ringout_air_mask = 0; + sink_floor = 0; + floor_idx = -1; + fld_on = 0; + sink_wall = 0.0f; + wall_idx = -1; + wall_hit_pos = 0; + + for (mat4& i : mat) + i = mat4_identity; + + for (mat4& i : push_mat) + i = mat4_identity; + + for (prj::BallCollision& i : cb_hit) + i = {}; + + for (prj::BallCollision& i : cb_rob) + i = {}; + + for (prj::BallCollision& i : cb_stg) + i = {}; + + for (pos_scale& i : field_1AA0) + i = {}; + + for (float_t& i : field_1BE4) + i = 0.0f; + + field_1C50.clear(); + field_1C50.resize(27); + + size_t v3 = 0; + for (std::pair& i : field_1C50) + i = { v3++, 0.0f }; + + field_1C68 = 27; + field_1C70 = 27; + field_1C78 = 27; + field_1C80 = 27; + + for (int32_t& i : field_1C88) + i = 0; + + for (int32_t& i : field_1CF4) + i = 0; + + for (int32_t& i : field_1D60) + i = 0; + + field_1DCC = 0; + field_1DD0 = 0; + field_1DD4 = 0; + field_1DD8 = 0; + sink = 0.0f; + max_ypos = 0.0f; + min_ypos = 0.0f; + max_idx = -1; + min_idx = -1; + top_ypos = 0.0f; + bot_ypos = 0.0f; + top_idx = -1; + bot_idx = -1; + + moveF = 0.0f; + moveR = 0.0f; + moveRT = 0.0f; + moveM = 0.0f; + moveD = 0.0f; + moveW[0] = 0.0f; + moveW[1] = 0.0f; + moveWd[0] = 0.0f; + moveWd[1] = 0.0f; + moveWr[0] = 0.0f; + moveWr[1] = 0.0f; + moveWT[0] = 0.0f; + moveWT[1] = 0.0f; + moveT[0] = 0.0f; + moveT[1] = 0.0f; + + for (RobColliWall& i : wall_info) + i.setup(); + + for (float_t& i : ringout_dist) + i = 0.0f; + + init_thrust_vec_req = true; + thrust_vec = 0.0f; + rep_hit_pos = 0.0f; + req_wall_break = false; + enable_dummy_collision = false; + fall_ringout = false; + req_kabe_yoroke = false; + calc_rob_colli = false; + colli_attack_hit = false; +} + +RobInfo::RobInfo() : en_dist(), en_dist_3d(), en_flag(), old_en_flag(), flag(), profit(), my_profit() { } -void rob_chara_data::reset() { - sub_140505C90(&action); - rob_sub_action.Reset(); - motion.reset(); - motdata.reset(); +void RobInfo::init() { + en_dist = 0; + en_dist_3d = 0; + en_dir_yang = 0; + en_dir_yang2 = 0; + revise_en_dir_yang = 0; + en_flag.u32 = 0; + old_en_flag.u32 = 0; + flag.u32 = 0; + en_nage_flag.reset(); + en_touch_nage_flag.reset(); + profit = 0.0f; + my_profit = 0.0f; +} + +RobRingOut::RobRingOut() : stop(), down(), stand(), fall(), +air(), air2down(), set_fix_hara(), replay_ringout() { + +} + +void RobRingOut::init() { + stop = false; + down = false; + stand = false; + fall = false; + air = false; + air2down = false; + set_fix_hara = false; + replay_ringout = false; + ringout_pos = 0.0f; + ringout_spd = 0.0f; +} + +RobSound::RobSound() : blow_flag() { + +} + +void RobSound::init() { + blow_flag = false; +} + +RobBase::RobBase() : flag(), arm_adjust_scale() { + +} + +RobBase::~RobBase() { + +} + +void RobBase::init() { + action.init(); + sub_action.init(); + robmot.reset(); + motdata.clear(); position.reset(); - adjust_data.reset(); - sub_140505FB0(&field_1E68); - field_3D90 = 0; - field_3D94 = 0; - field_3D98 = 0; - field_3D9C = 0; - field_3DA0 = 0; - field_3DA8 = 0; - field_3DB0 = 0; - field_3DB8 = 0; - field_3DBC = 0; - field_3DA4 = 0; - field_3DC8 = 0; - field_3DD4 = 0.0f; - field_3DCC = 0; - field_3DC0 = 0; - field_3DC4 = 0; - field_3DD8 = 0; - field_3DD0 = 0; - field_3DDC = 0.0f; - field_3DE0 = 0; + adjust.reset(); + collision.init(); + robinfo.init(); + ringout.init(); + sound.init(); arm_adjust_scale = 1.0f; } -rob_chara::rob_chara() : chara_id(), type(), field_C(), field_D(), -chara_num(), cos_id(), rob_data(), field_20() { +rob_chara::rob_chara() : idnm(), type(), energy(), disp_pos_reset(), +disp_pos_reset_forbidden(), chara_num(), cos_id(), rob_data(), enemy() { frame_speed = 1.0f; bone_data = new rob_chara_bone_data(); - rob_disp = new rob_chara_item_equip(); + disp = new RobDisp(); } rob_chara::~rob_chara() { delete bone_data; bone_data = 0; - delete rob_disp; - rob_disp = 0; -} - -int32_t expression_id_to_mottbl_index(int32_t expression_id) { - static const int32_t expression_id_to_mottbl_index_table[] = { - 11, 15, 57, 19, 23, 25, 29, 33, - 37, 41, 45, 49, 53, 65, 7, 69, - 73, 77, 81, 85, 89, 7, 61, 6, - 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 93, 95, 97, 99, 101, 103, - 105, 107, 109, 111, 113, 115, 117, 119, - 121, 123, 125, 127, 13, 21, 31, 39, - 43, 47, 51, 55, 67, 71, 79, 83, - 129, 59, 17, 91, 27, 87, 35, 75, - 9, 63, 236, 238, 240, 242, - }; - - if (expression_id >= 0 && expression_id - < sizeof(expression_id_to_mottbl_index_table) / sizeof(int32_t)) - return expression_id_to_mottbl_index_table[expression_id]; - return 6; -} - -/* -195 CMN_HAND_OPEN 0 -196 CMN_HAND_CLOSE 1 -194 CMN_HAND_NORMAL 2 -197 CMN_HAND_PEACE 3 -201 CMN_HAND_NEGI 4 -198 CMN_HAND_MIC 5 -199 CMN_HAND_ONE 6 -202 CMN_HAND_SIZEN 7 -203 CMN_HAND_PICK 8 -192 (null) 9 -200 CMN_HAND_THREE 10 -204 CMN_HAND_MIC 11,12,13 -193 CMN_HAND_RESET 14*/ - -int32_t hand_anim_id_to_mottbl_index(int32_t hand_anim_id) { - static const int32_t hand_anim_id_to_mottbl_index_table[] = { - 195, 196, 194, 197, 201, 198, 199, 202, - 203, 192, 200, 204, 204, 204, 193, - }; - - if (hand_anim_id >= 0 && hand_anim_id - < sizeof(hand_anim_id_to_mottbl_index_table) / sizeof(int32_t)) - return hand_anim_id_to_mottbl_index_table[hand_anim_id]; - return 192; -} - -int32_t look_anim_id_to_mottbl_index(int32_t look_anim_id) { - static const int32_t look_anim_id_to_mottbl_index_table[] = { - 168, 170, 174, 172, 178, 176, 182, 180, - 166, 165, 224, 169, 171, 175, 173, 179, - 177, 183, 181, 167, - }; - - if (look_anim_id >= 0 && look_anim_id - < sizeof(look_anim_id_to_mottbl_index_table) / sizeof(int32_t)) - return look_anim_id_to_mottbl_index_table[look_anim_id]; - return 165; -} - -int32_t mouth_anim_id_to_mottbl_index(int32_t mouth_anim_id) { - static const int32_t mouth_anim_id_to_mottbl_index_table[] = { - 134, 140, 142, 146, 144, 148, 150, 152, - 132, 131, 136, 138, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 151, - 135, 143, 147, 145, 133, 137, 139, 141, - 149, 153, 244, 245, 246, 247, 248, 249, - 250, 251, 252, - }; - - if (mouth_anim_id >= 0 && mouth_anim_id - < sizeof(mouth_anim_id_to_mottbl_index_table) / sizeof(int32_t)) - return mouth_anim_id_to_mottbl_index_table[mouth_anim_id]; - return 131; + delete disp; + disp = 0; } OpdMaker::Data::Data() : empty() { @@ -16438,27 +17345,27 @@ bool OpdMaker::Data::CheckOpdiFilesNotReady() { return false; } -const void* OpdMaker::Data::GetOpdiFileData(object_info obj_info, uint32_t motion_id) { - auto elem = opdi_files.find({ obj_info, motion_id }); +const void* OpdMaker::Data::GetOpdiFileData(object_info obj_info, uint32_t motnum) { + auto elem = opdi_files.find({ obj_info, motnum }); if (elem != opdi_files.end()) return elem->second->get_data(); return 0; } -bool OpdMaker::Data::IsValidOpdiFile(rob_chara* rob_chr, uint32_t motion_id) { +bool OpdMaker::Data::IsValidOpdiFile(rob_chara* rob_chr, uint32_t motnum) { if (!rob_chr) return false; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; for (int32_t i = RPK_KAMI; i < RPK_MAX; i++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)i); object_info obj_info = skin_disp->obj_uid; if (obj_info.not_null() && skin_disp->osage_nodes_count) { - size_t data = (size_t)GetOpdiFileData(obj_info, motion_id); + size_t data = (size_t)GetOpdiFileData(obj_info, motnum); if (!data || *((uint16_t*)(data + 0x04)) != (uint16_t)obj_info.id || *((uint16_t*)(data + 0x06)) != (uint16_t)obj_info.set_id - || *((int32_t*)(data + 0x08)) != motion_id + || *((int32_t*)(data + 0x08)) != motnum || *((uint16_t*)(data + 0x0C)) != skin_disp->osage_nodes_count) return false; } @@ -16473,9 +17380,9 @@ void OpdMaker::Data::ReadOpdiFiles(rob_chara* rob_chr, std::vector& mo data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; for (int32_t i = RPK_KAMI; i < RPK_MAX; i++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)i); if (skin_disp->obj_uid.is_null() || !skin_disp->osage_nodes_count) continue; @@ -16541,9 +17448,9 @@ void OpdMaker::Ctrl() { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; motion_index = 0; - int32_t chara_id = rob_chr->chara_id; + ROB_ID rob_id = (ROB_ID)rob_chr->idnm; - opd_chara_data_array_open_opd_file(chara_id); + opd_chara_data_array_open_opd_file(rob_id); do { if (GetEnd()) { @@ -16551,44 +17458,44 @@ void OpdMaker::Ctrl() { return; } - uint32_t motion_id = (*motion_ids)[motion_index]; - if (motion_id == -1) + uint32_t motnum = (*motion_ids)[motion_index]; + if (motnum == -1) break; - rob_chr->set_motion_id(motion_id, 0.0f, 0.0f, + rob_chr->replace_rob_motion(motnum, 0.0f, 0.0f, true, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); - float_t frame_count = (float_t)(int32_t)rob_chr->bone_data->get_frame_count() - 1.0f; - int32_t iterations = 60; - if (rob_chr->data.motdata.field_0.iterations > 0) - iterations = rob_chr->data.motdata.field_0.iterations; + float_t frame_max = (float_t)(int32_t)rob_chr->bone_data->get_frame_max() - 1.0f; + int32_t init_cnt = 60; + if (rob_chr->rob_base.motdata.init_cnt > 0) + init_cnt = rob_chr->rob_base.motdata.init_cnt; float_t start_frame = 0.0f; bool no_opdi = true; - if (data && data->IsValidOpdiFile(rob_chr, motion_id)) { + if (data && data->IsValidOpdiFile(rob_chr, motnum)) { no_opdi = false; - int32_t frame_count_int = (int32_t)frame_count; - int32_t iteration = frame_count_int; - start_frame = frame_count - 1.0f; - while (iteration < iterations) { - iteration += frame_count_int; - start_frame = (float_t)(iteration - 1); + int32_t frame_max_int = (int32_t)frame_max; + int32_t init = frame_max_int; + start_frame = frame_max - 1.0f; + while (init < init_cnt) { + init += frame_max_int; + start_frame = (float_t)(init - 1); } } - rob_osage_mothead osg_mhd(rob_chr, 0, motion_id, start_frame, aft_bone_data, aft_mot_db); + rob_osage_mothead osg_mhd(rob_chr, 0, motnum, start_frame, aft_bone_data, aft_mot_db); if (no_opdi) { uint64_t frame = 0; - int32_t iteration = 0; + int32_t init = 0; while (true) { osg_mhd.set_frame((float_t)(int64_t)frame); osg_mhd.ctrl(); frame++; - iteration++; - if ((float_t)(int64_t)frame >= frame_count) { - if (iteration > iterations) + init++; + if ((float_t)(int64_t)frame >= frame_max) { + if (init > init_cnt) break; frame = 0; @@ -16598,30 +17505,30 @@ void OpdMaker::Ctrl() { } else { osg_mhd.ctrl(); - SetOsagePlayInitData(motion_id); + SetOsagePlayInitData(motnum); } osg_mhd.init_data(aft_mot_db); - opd_chara_data_array_init_data(chara_id, motion_id); + opd_chara_data_array_init_data(rob_id, motnum); uint64_t frame_int = 0; float_t frame = 0.0f; - while (frame < frame_count) { + while (frame < frame_max) { osg_mhd.set_frame(frame); osg_mhd.ctrl(); - opd_chara_data_array_add_frame_data(chara_id); + opd_chara_data_array_add_frame_data(rob_id); frame = (float_t)(int64_t)++frame_int; } - opd_chara_data_array_encode_data(chara_id); + opd_chara_data_array_encode_data(rob_id); } while (CheckForFinalMotion()); - opd_chara_data_array_write_file(chara_id); + opd_chara_data_array_write_file(rob_id); const char* ram_osage_play_data_tmp_path = get_ram_osage_play_data_tmp_dir(); - std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, chara_id); + std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, rob_id); std::vector files = path_get_files(chara_dir.c_str()); for (std::string& i : files) { @@ -16735,16 +17642,16 @@ void OpdMaker::Reset() { thread = 0; } -bool OpdMaker::SetOsagePlayInitData(uint32_t motion_id) { - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; +bool OpdMaker::SetOsagePlayInitData(uint32_t motnum) { + RobDisp* disp = rob_chr->disp; for (int32_t i = RPK_KAMI; i < RPK_MAX; i++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)i); if (skin_disp->obj_uid.is_null() || !skin_disp->osage_nodes_count) continue; - size_t data = (size_t)this->data->GetOpdiFileData(skin_disp->obj_uid, motion_id); + size_t data = (size_t)this->data->GetOpdiFileData(skin_disp->obj_uid, motnum); if (data) - rob_disp->set_osage_play_data_init((ROB_PARTS_KIND)i, (float_t*)(data + 0x10)); + disp->set_osage_play_data_init((ROB_PARTS_KIND)i, (float_t*)(data + 0x10)); } return true; } @@ -16763,8 +17670,8 @@ void OpdMaker::ThreadMain(OpdMaker* opd_maker) { opd_maker->Ctrl(); } -OpdMakeWorker::OpdMakeWorker(int32_t chara_id) : state(), items(), use_current_skp() { - this->chara_id = chara_id; +OpdMakeWorker::OpdMakeWorker(ROB_ID rob_id) : state(), items(), use_current_skp() { + this->rob_id = rob_id; } OpdMakeWorker::~OpdMakeWorker() { @@ -16782,27 +17689,25 @@ bool OpdMakeWorker::ctrl() { bone_database* aft_bone_data = &aft_data->data_ft.bone_data; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); CHARA_NUM chara_num = rob_chr->chara_num; const RobData* rob_data = get_rob_data(chara_num); switch (state) { case 1: { opd_make_manager->chara_data.PopItems(chara_num, items); - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) { - rob_chr->item_cos_data.set_chara_num(chara_num); - rob_chr->item_cos_data.set_item(items[i]); - } + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + RobItem::s_regist_item_one(chara_num, items[i], &rob_chr->item); - rob_chr->rob_disp->reset_init_data(rob_chara_bone_data_get_node( - rob_chara_array[chara_id].bone_data, BONE_NODE_N_HARA_CP)); - rob_chr->rob_disp->set_shadow_group(chara_id); - rob_chr->rob_disp->shadow_flag = 0x05; + rob_chr->disp->reset_init_data(rob_chara_bone_data_get_node( + RobManagement::rob_impl[rob_id].bone_data, BONE_NODE_N_HARA_CP)); + rob_chr->disp->set_shadow_group(rob_id); + rob_chr->disp->shadow_flag = 0x05; state = 2; } case 2: { if (!task_rob_load_check_load_req_data()) { - task_rob_load_append_load_req_data_obj(chara_num, rob_chr->item_cos_data.get_cos()); + task_rob_load_append_load_req_data_obj(chara_num, rob_chr->item.get_equip()); state = 3; } } break; @@ -16810,10 +17715,10 @@ bool OpdMakeWorker::ctrl() { if (task_rob_load_check_load_req_data()) break; - rob_chr->item_cos_data.reload_items(chara_id, aft_bone_data, aft_data, aft_obj_db); + rob_chr->item.equip(rob_id, aft_bone_data, aft_data, aft_obj_db); for (int32_t i = RPK_ITEM_BEGIN; i <= RPK_ITEM_END; i++) { - rob_chara_item_equip_object* skin_disp = rob_chr->rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + const RobSkinDisp* skin_disp = rob_chr->disp->get_skin_work((ROB_PARTS_KIND)i); if (!objset_info_storage_get_obj_name(skin_disp->obj_uid) && skin_disp->osage_nodes_count) continue; @@ -16845,23 +17750,23 @@ bool OpdMakeWorker::ctrl() { std::vector osage_init; for (const uint32_t& i : opd_make_manager->motion_ids) osage_init.push_back(osage_init_data(rob_chr, i)); - skin_param_manager_add_task(chara_id, osage_init); + skin_param_manager_add_task(rob_id, osage_init); state = 7; } break; case 7: { - if (skin_param_manager_check_task_ready(chara_id)) + if (skin_param_manager_check_task_ready(rob_id)) break; state = 8; } case 8: { path_create_directory(get_ram_osage_play_data_tmp_dir()); - opd_maker_array[chara_id].InitThread(rob_chr, &opd_make_manager->motion_ids, + opd_maker_array[rob_id].InitThread(rob_chr, &opd_make_manager->motion_ids, opd_make_manager->use_opdi ? &data : 0); state = 9; } break; case 9: { - if (opd_maker_array[chara_id].IsWaiting()) + if (opd_maker_array[rob_id].IsWaiting()) break; data.Reset(); @@ -16869,7 +17774,7 @@ bool OpdMakeWorker::ctrl() { const char* ram_osage_play_data_path = get_ram_osage_play_data_dir(); const char* ram_osage_play_data_tmp_path = get_ram_osage_play_data_tmp_dir(); - std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, chara_id); + std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, rob_id); std::vector files = path_get_files(chara_dir.c_str()); for (std::string& i : files) { @@ -16887,15 +17792,13 @@ bool OpdMakeWorker::ctrl() { state = 10; } case 10: { - task_rob_load_append_free_req_data_obj(chara_num, rob_chr->item_cos_data.get_cos()); + task_rob_load_append_free_req_data_obj(chara_num, rob_chr->item.get_equip()); - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) { - rob_chr->item_cos_data.set_chara_num(chara_num); - rob_chr->item_cos_data.set_item_zero(items[i]); - } + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) + RobItem::s_delete_item(chara_num, items[i], &rob_chr->item); - rob_chr->item_cos_data.reload_items(chara_id, aft_bone_data, aft_data, aft_obj_db); - skin_param_manager_reset(chara_id); + rob_chr->item.equip(rob_id, aft_bone_data, aft_data, aft_obj_db); + skin_param_manager_reset(rob_id); if (opd_make_manager->chara_data.CheckNoItems(chara_num)) return true; state = 1; @@ -16905,12 +17808,12 @@ bool OpdMakeWorker::ctrl() { } bool OpdMakeWorker::dest() { - if (opd_maker_array[chara_id].IsWaiting()) { - opd_maker_array[chara_id].SetEnd(); + if (opd_maker_array[rob_id].IsWaiting()) { + opd_maker_array[rob_id].SetEnd(); return false; } else { - opd_maker_array[chara_id].Reset(); + opd_maker_array[rob_id].Reset(); return true; } } @@ -16920,7 +17823,7 @@ void OpdMakeWorker::disp() { } bool OpdMakeWorker::add_task(bool use_current_skp) { - if (!task_rob_manager_check_chara_loaded(chara_id)) + if (!task_rob_manager_check_chara_loaded(rob_id)) return false; this->use_current_skp = use_current_skp; @@ -16985,19 +17888,20 @@ void OpdPlayGen::Ctrl() { opd_play_gen_run = true; std::vector motion_ids[6]; for (auto& i : gen_data) { - const uint32_t motion_id = i.first; + const uint32_t motnum = i.first; - for (int32_t chara_id = 0; chara_id < ROB_ID_MAX && i.second.size(); chara_id++) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + for (int32_t j = 0; j < ROB_ID_MAX && i.second.size(); j++) { + ROB_ID rob_id = (ROB_ID)j; + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) continue; - std::vector& set_motion = this->set_motion[chara_id]; + std::vector& set_motion = this->set_motion[rob_id]; if (set_motion.size()) { bool found_set_motion = false; for (pv_data_set_motion& j : set_motion) - if (j.motion_id == motion_id) { + if (j.motnum == motnum) { found_set_motion = true; break; } @@ -17006,10 +17910,10 @@ void OpdPlayGen::Ctrl() { continue; } - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; for (int32_t j = RPK_ITEM_BEGIN; j < RPK_ITEM_END && i.second.size(); j++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)j); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)j); auto find = [](std::vector>& vec, const object_info key) { auto k = vec.begin(); @@ -17031,8 +17935,8 @@ void OpdPlayGen::Ctrl() { auto elem = find(i.second, skin_disp->obj_uid); if (elem != i.second.end()) { if (elem->second.generate) { - obj_info[chara_id][j - RPK_ITEM_BEGIN] = skin_disp->obj_uid; - motion_ids[chara_id].push_back(motion_id); + obj_info[rob_id][j - RPK_ITEM_BEGIN] = skin_disp->obj_uid; + motion_ids[rob_id].push_back(motnum); } i.second.erase(elem); @@ -17041,37 +17945,39 @@ void OpdPlayGen::Ctrl() { } } - for (int32_t chara_id = 0; chara_id < ROB_ID_MAX; chara_id++) { - std::vector& _motion_ids = motion_ids[chara_id]; + for (int32_t i = 0; i < ROB_ID_MAX; i++) { + ROB_ID rob_id = (ROB_ID)i; + std::vector& _motion_ids = motion_ids[rob_id]; std::sort(_motion_ids.begin(), _motion_ids.end()); _motion_ids.erase(std::unique(_motion_ids.begin(), _motion_ids.end()), _motion_ids.end()); } - for (int32_t chara_id = 0; chara_id < ROB_ID_MAX; chara_id++) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + for (int32_t i = 0; i < ROB_ID_MAX; i++) { + ROB_ID rob_id = (ROB_ID)i; + rob_chara* rob_chr = rob_chara_array_get((ROB_ID)rob_id); if (!rob_chr) continue; - for (const uint32_t motion_id : motion_ids[chara_id]) { - rob_chr->set_motion_id(motion_id, 0.0f, 0.0f, + for (const uint32_t motnum : motion_ids[rob_id]) { + rob_chr->replace_rob_motion(motnum, 0.0f, 0.0f, true, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); //rob_chr->set_step_motion_step(1.0f); - float_t frame_count = (float_t)(int32_t)rob_chr->bone_data->get_frame_count() - 1.0f; - uint32_t iterations = 60; - if (rob_chr->data.motdata.field_0.iterations > 0) - iterations = rob_chr->data.motdata.field_0.iterations; + float_t frame_max = (float_t)(int32_t)rob_chr->bone_data->get_frame_max() - 1.0f; + uint32_t init_cnt = 60; + if (rob_chr->rob_base.motdata.init_cnt > 0) + init_cnt = rob_chr->rob_base.motdata.init_cnt; bool has_opd = false; { const uint32_t* opd_motion_ids = get_opd_motion_ids(); while (*opd_motion_ids != -1 && !has_opd) { - if (*opd_motion_ids == motion_id) + if (*opd_motion_ids == motnum) has_opd = true; opd_motion_ids++; } - const uint32_t motion_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motion_id); + const uint32_t motion_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motnum); const uint32_t* opd_motion_set_ids = get_opd_motion_set_ids(); while (*opd_motion_set_ids != -1 && !has_opd) { if (*opd_motion_set_ids == motion_set_id) @@ -17080,32 +17986,32 @@ void OpdPlayGen::Ctrl() { } } - std::vector& set_motion = this->set_motion[chara_id]; + std::vector& set_motion = this->set_motion[rob_id]; bool has_osage_reset = false; // Added - rob_osage_mothead osg_mhd(rob_chr, 0, motion_id, 0.0f, false, aft_bone_data, aft_mot_db); + rob_osage_mothead osg_mhd(rob_chr, 0, motnum, 0.0f, false, aft_bone_data, aft_mot_db); if (has_opd) { rob_osage_mothead_data* osage_reset = new rob_osage_mothead_data( - MOTHEAD_DATA_OSAGE_RESET, motion_id, aft_mot_db); - const mothead_data* osage_reset_data = osage_reset->find_next_data(); + MHP_OSAGE_RESET, motnum, aft_mot_db); + MhpList* osage_reset_data = osage_reset->find_next_data(); uint64_t frame = 0; - uint64_t iteration = 0; + uint64_t init = 0; while (true) { osg_mhd.set_frame((float_t)(int64_t)frame); osg_mhd.ctrl(); if (osage_reset_data) { // Added if (osage_reset_data->frame == 0) { - uint32_t _motion_id = motion_id; + uint32_t _motion_id = motnum; float_t _frame = (float_t)(int64_t)frame; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; for (int32_t i = 0; i < 600; i++) // Should calm phys osg_mhd.ctrl(); rob_chara_add_motion_reset_data(rob_chr, _motion_id, _frame, 0); - set_motion.push_back({ motion_id, { (float_t)(int64_t)frame, 0 } }); + set_motion.push_back({ motnum, { (float_t)(int64_t)frame, 0 } }); has_osage_reset = true; } @@ -17113,9 +18019,9 @@ void OpdPlayGen::Ctrl() { } frame++; - iteration++; - if ((float_t)(int64_t)frame >= frame_count) { - if (iteration > iterations) + init++; + if ((float_t)(int64_t)frame >= frame_max) { + if (init > init_cnt) break; frame = 0; @@ -17131,18 +18037,18 @@ void OpdPlayGen::Ctrl() { osg_mhd.init_data(aft_mot_db); - opd_chara_data_array_init_data(chara_id, motion_id); + opd_chara_data_array_init_data(rob_id, motnum); bool no_loop = has_osage_reset; // Added size_t set_motion_index = 0; uint64_t frame_int = 0; float_t frame = 0.0f; - while (frame <= frame_count) { + while (frame <= frame_max) { osg_mhd.set_frame(frame); while (set_motion_index < set_motion.size()) { - if (set_motion.data()[set_motion_index].motion_id != motion_id) { + if (set_motion.data()[set_motion_index].motnum != motnum) { set_motion_index++; continue; } @@ -17152,26 +18058,26 @@ void OpdPlayGen::Ctrl() { if (_frame > frame) break; - rob_chr->set_motion_skin_param(motion_id, _frame); - rob_chr->set_motion_reset_data(motion_id, _frame); + rob_chr->set_motion_skin_param(motnum, _frame); + rob_chr->set_motion_reset_data(motnum, _frame); set_motion_index++; } osg_mhd.ctrl(); - opd_chara_data_array_add_frame_data(chara_id); + opd_chara_data_array_add_frame_data(rob_id); frame = (float_t)(int64_t)++frame_int; } - opd_chara_data* opd_chr_data = opd_chara_data_array_get(chara_id); + opd_chara_data* opd_chr_data = opd_chara_data_array_get(rob_id); for (int32_t i = 0; i < RPK_ITEM_MAX; i++) { - object_info obj_info = this->obj_info[chara_id][i]; - this->obj_info[chara_id][i] = {}; + object_info obj_info = this->obj_info[rob_id][i]; + this->obj_info[rob_id][i] = {}; if (obj_info.is_null()) continue; int32_t load_count = 1; - auto elem = osage_play_data_manager->file_data.find({ obj_info, motion_id }); + auto elem = osage_play_data_manager->file_data.find({ obj_info, motnum }); if (elem != osage_play_data_manager->file_data.end()) continue; @@ -17181,8 +18087,8 @@ void OpdPlayGen::Ctrl() { for (const std::vector& j : opd_data) nodes_count += j.size(); - int64_t _frame_count = (int64_t)frame_count; - float_t* buf = (float_t*)malloc(sizeof(float_t) * 3ULL * _frame_count * nodes_count); + int64_t frame_count = (int64_t)frame_max; + float_t* buf = (float_t*)malloc(sizeof(float_t) * 3ULL * frame_count * nodes_count); if (!buf) continue; @@ -17190,8 +18096,8 @@ void OpdPlayGen::Ctrl() { memset(&data.head, 0, sizeof(data.head)); data.head.obj_info.first = obj_info.id; data.head.obj_info.second = obj_info.set_id; - data.head.motion_id = motion_id; - data.head.frame_count = (uint32_t)_frame_count; + data.head.motnum = motnum; + data.head.frame_count = (uint32_t)frame_count; data.head.nodes_count = (uint16_t)nodes_count; *(uint16_t*)((uint8_t*)&data.head + 0x12) = no_loop ? 0x01 : 0x00; data.data = buf; @@ -17199,23 +18105,23 @@ void OpdPlayGen::Ctrl() { for (const std::vector& j : opd_data) for (const opd_vec3_data_vec& k : j) { - memcpy(buf, k.x.data(), _frame_count * sizeof(float_t)); - buf += _frame_count; - memcpy(buf, k.y.data(), _frame_count * sizeof(float_t)); - buf += _frame_count; - memcpy(buf, k.z.data(), _frame_count * sizeof(float_t)); - buf += _frame_count; + memcpy(buf, k.x.data(), frame_count * sizeof(float_t)); + buf += frame_count; + memcpy(buf, k.y.data(), frame_count * sizeof(float_t)); + buf += frame_count; + memcpy(buf, k.z.data(), frame_count * sizeof(float_t)); + buf += frame_count; } - osage_play_data_manager->file_data.insert({ { obj_info, motion_id }, data }); + osage_play_data_manager->file_data.insert({ { obj_info, motnum }, data }); } - opd_chara_data_array_encode_data(chara_id); + opd_chara_data_array_encode_data(rob_id); opd_chr_data->reset(); } - motion_ids[chara_id].clear(); - motion_ids[chara_id].shrink_to_fit(); + motion_ids[rob_id].clear(); + motion_ids[rob_id].shrink_to_fit(); } opd_play_gen_run = false; @@ -17239,7 +18145,7 @@ void OpdPlayGen::ThreadMain(OpdPlayGen* opd_play) { osage_play_data_header::osage_play_data_header() : frame_count(), nodes_count() { signature = 0x11033115; obj_info = { -1, -1 }; - motion_id = -1; + motnum = -1; } opd_file_data::opd_file_data() : data(), load_count() { @@ -17262,8 +18168,8 @@ opd_vec3_data_vec::~opd_vec3_data_vec() { } -opd_chara_data::opd_chara_data() : chara_id(), init(), frame_index(), frame_count(), motion_id(), field_18() { - chara_id = opd_chara_data_counter++; +opd_chara_data::opd_chara_data() : rob_id(), init(), frame(), frame_max(), motnum(), field_18() { + rob_id = (ROB_ID)opd_chara_data_counter++; reset(); } @@ -17272,71 +18178,69 @@ opd_chara_data::~opd_chara_data() { } void opd_chara_data::add_frame_data() { - if (!init || frame_index >= frame_count) + if (!init || frame >= frame_max) return; - rob_chara_item_equip* rob_disp = rob_chara_array_get(chara_id)->rob_disp; + RobDisp* disp = rob_chara_array_get(rob_id)->disp; for (int32_t i = 0; i < RPK_ITEM_MAX; i++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; std::vector>& opd_data = this->opd_data[i]; size_t node_index = 0; - for (ExOsageBlock*& j : skin_disp->osage_blk) { + for (const ExOsageBlock* j : skin_disp->osage_blk) { std::vector& opd_node_data = opd_data.data()[node_index++]; - RobJointNode* k_begin = j->osage_work.joint_node_vec.data() + 1; - RobJointNode* k_end = j->osage_work.joint_node_vec.data() + j->osage_work.joint_node_vec.size(); + const RobJointNode* k_begin = j->osage_work.joint_node_vec.data() + 1; + const RobJointNode* k_end = j->osage_work.joint_node_vec.data() + j->osage_work.joint_node_vec.size(); size_t l = 0; - for (RobJointNode* k = k_begin; k != k_end; k++, l++) { - opd_node_data.data()[l].x.data()[frame_index] = k->reset_data.pos.x; - opd_node_data.data()[l].y.data()[frame_index] = k->reset_data.pos.y; - opd_node_data.data()[l].z.data()[frame_index] = k->reset_data.pos.z; + for (const RobJointNode* k = k_begin; k != k_end; k++, l++) { + opd_node_data.data()[l].x.data()[frame] = k->reset_data.pos.x; + opd_node_data.data()[l].y.data()[frame] = k->reset_data.pos.y; + opd_node_data.data()[l].z.data()[frame] = k->reset_data.pos.z; } } - for (ExClothBlock*& j : skin_disp->cloth) { + for (const ExClothBlock* j : skin_disp->cloth) { std::vector& opd_node_data = opd_data.data()[node_index++]; - CLOTH_VERTEX* k_begin = j->cloth_work.vtxarg.data() + j->cloth_work.width; - CLOTH_VERTEX* k_end = j->cloth_work.vtxarg.data() + j->cloth_work.vtxarg.size(); + const CLOTH_VERTEX* k_begin = j->cloth_work.vtxarg.data() + j->cloth_work.width; + const CLOTH_VERTEX* k_end = j->cloth_work.vtxarg.data() + j->cloth_work.vtxarg.size(); size_t l = 0; - for (CLOTH_VERTEX* k = k_begin; k != k_end; k++, l++) { - opd_node_data.data()[l].x.data()[frame_index] = k->reset_data.pos.x; - opd_node_data.data()[l].y.data()[frame_index] = k->reset_data.pos.y; - opd_node_data.data()[l].z.data()[frame_index] = k->reset_data.pos.z; + for (const CLOTH_VERTEX* k = k_begin; k != k_end; k++, l++) { + opd_node_data.data()[l].x.data()[frame] = k->reset_data.pos.x; + opd_node_data.data()[l].y.data()[frame] = k->reset_data.pos.y; + opd_node_data.data()[l].z.data()[frame] = k->reset_data.pos.z; } } } - frame_index++; + frame++; } void opd_chara_data::encode_data() { - if (!init || frame_index != frame_count) + if (!init || frame != frame_max) return; data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - const char* motion_name = aft_mot_db->get_motion_name(this->motion_id); + const char* motion_name = aft_mot_db->get_motion_name(this->motnum); if (!motion_name) return; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; - std::string buf = sprintf_s_string("%s/%d", get_ram_osage_play_data_tmp_dir(), chara_id); + std::string buf = sprintf_s_string("%s/%d", get_ram_osage_play_data_tmp_dir(), rob_id); p_farc_write* opd = this->opd; for (int32_t i = 0; i < RPK_ITEM_MAX; i++, opd++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; @@ -17351,7 +18255,7 @@ void opd_chara_data::encode_data() { for (const std::vector& j : opd_data) nodes_count += j.size(); - size_t max_size = sizeof(osage_play_data_header) + (6ULL * (frame_count + 2ULL) * nodes_count); + size_t max_size = sizeof(osage_play_data_header) + (6ULL * (frame_max + 2ULL) * nodes_count); uint8_t* data = prj::MemoryManager::alloc(prj::MemCTemp, max_size, "OPD_ENCORD_BUF"); if (!data) continue; @@ -17360,8 +18264,8 @@ void opd_chara_data::encode_data() { osage_play_data_header* opd_head = (osage_play_data_header*)data; opd_head->signature = 0; - opd_head->frame_count = frame_count; - opd_head->motion_id = motion_id; + opd_head->frame_count = frame_max; + opd_head->motnum = motnum; opd_head->obj_info = { (uint16_t)obj_info.id, (uint16_t)obj_info.set_id }; opd_head->nodes_count = (uint16_t)skin_disp->osage_nodes_count; @@ -17401,27 +18305,26 @@ void opd_chara_data::encode_data() { reset(); } -void opd_chara_data::encode_init_data(uint32_t motion_id) { - if (!init || frame_index != frame_count) +void opd_chara_data::encode_init_data(uint32_t motnum) { + if (!init || frame != frame_max) return; data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - const char* motion_name = aft_mot_db->get_motion_name(this->motion_id); + const char* motion_name = aft_mot_db->get_motion_name(this->motnum); if (!motion_name) return; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; p_farc_write* opdi = this->opdi; for (int32_t i = 0; i < RPK_ITEM_MAX; i++, opdi++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; @@ -17434,33 +18337,33 @@ void opd_chara_data::encode_init_data(uint32_t motion_id) { uint8_t* data = prj::MemoryManager::alloc(prj::MemCTemp, size, "OPDI_WRITE_BUF"); osage_play_data_init_header* opdi_head = (osage_play_data_init_header*)data; - opdi_head->motion_id = motion_id; + opdi_head->motnum = motnum; opdi_head->obj_info = { (uint16_t)obj_info.id, (uint16_t)obj_info.set_id }; opdi_head->nodes_count = (uint16_t)skin_disp->osage_nodes_count; vec3* d = (vec3*)(data + sizeof(osage_play_data_init_header)); - for (ExOsageBlock*& j : skin_disp->osage_blk) { + for (const ExOsageBlock* j : skin_disp->osage_blk) { if (!(j->osage_work.joint_node_vec.size())) break; - RobJointNode* k_begin = j->osage_work.joint_node_vec.data() + 1; - RobJointNode* k_end = j->osage_work.joint_node_vec.data() + j->osage_work.joint_node_vec.size(); - for (RobJointNode* k = k_begin; k != k_end; k++) { + const RobJointNode* k_begin = j->osage_work.joint_node_vec.data() + 1; + const RobJointNode* k_end = j->osage_work.joint_node_vec.data() + j->osage_work.joint_node_vec.size(); + for (const RobJointNode* k = k_begin; k != k_end; k++) { d[0] = k->pos; d[1] = k->vec; d += 2; } } - for (ExClothBlock*& j : skin_disp->cloth) { + for (const ExClothBlock* j : skin_disp->cloth) { if (!(j->cloth_work.vtxarg.size())) break; - CLOTH_VERTEX* k_begin = j->cloth_work.vtxarg.data() + j->cloth_work.width; - CLOTH_VERTEX* k_end = j->cloth_work.vtxarg.data() + j->cloth_work.vtxarg.size(); + const CLOTH_VERTEX* k_begin = j->cloth_work.vtxarg.data() + j->cloth_work.width; + const CLOTH_VERTEX* k_end = j->cloth_work.vtxarg.data() + j->cloth_work.vtxarg.size(); size_t l = 0; - for (CLOTH_VERTEX* k = k_begin; k != k_end; k++, l++) { + for (const CLOTH_VERTEX* k = k_begin; k != k_end; k++, l++) { d[0] = k->pos; d[1] = k->vec; d += 2; @@ -17474,17 +18377,16 @@ void opd_chara_data::encode_init_data(uint32_t motion_id) { } void opd_chara_data::fs_copy_file() { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; - std::string tmp_dir = sprintf_s_string("%s/%d", get_dev_ram_opdi_dir(), rob_chr->chara_id); + std::string tmp_dir = sprintf_s_string("%s/%d", get_dev_ram_opdi_dir(), rob_chr->idnm); for (int32_t i = 0; i < RPK_ITEM_MAX; i++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; opdi[i].write_file(); @@ -17502,16 +18404,15 @@ void opd_chara_data::fs_copy_file() { path_delete_directory(tmp_dir.c_str()); } -void opd_chara_data::init_data(uint32_t motion_id) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); +void opd_chara_data::init_data(uint32_t motnum) { + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; - int32_t frame_count = (int32_t)rob_chr->data.motdata.field_0.frame; + RobDisp* disp = rob_chr->disp; + int32_t frame_max = (int32_t)rob_chr->rob_base.motdata.frame; for (int32_t i = 0; i < RPK_ITEM_MAX; i++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; @@ -17520,59 +18421,58 @@ void opd_chara_data::init_data(uint32_t motion_id) { opd_data.resize(skin_disp->cloth.size() + skin_disp->osage_blk.size()); size_t node_index = 0; - for (ExOsageBlock*& j : skin_disp->osage_blk) { + for (const ExOsageBlock* j : skin_disp->osage_blk) { std::vector& opd_node_data = opd_data.data()[node_index++]; opd_node_data.resize(j->osage_work.joint_node_vec.size() - 1); - RobJointNode* k_begin = j->osage_work.joint_node_vec.data() + 1; - RobJointNode* k_end = j->osage_work.joint_node_vec.data() + j->osage_work.joint_node_vec.size(); + const RobJointNode* k_begin = j->osage_work.joint_node_vec.data() + 1; + const RobJointNode* k_end = j->osage_work.joint_node_vec.data() + j->osage_work.joint_node_vec.size(); size_t l = 0; - for (RobJointNode* k = k_begin; k != k_end; k++, l++) { - opd_node_data.data()[l].x.resize(frame_count); - opd_node_data.data()[l].y.resize(frame_count); - opd_node_data.data()[l].z.resize(frame_count); + for (const RobJointNode* k = k_begin; k != k_end; k++, l++) { + opd_node_data.data()[l].x.resize(frame_max); + opd_node_data.data()[l].y.resize(frame_max); + opd_node_data.data()[l].z.resize(frame_max); } } - for (ExClothBlock*& j : skin_disp->cloth) { + for (const ExClothBlock* j : skin_disp->cloth) { std::vector& opd_node_data = opd_data.data()[node_index++]; opd_node_data.resize(j->cloth_work.vtxarg.size() - j->cloth_work.width); - CLOTH_VERTEX* k_begin = j->cloth_work.vtxarg.data() + j->cloth_work.width; - CLOTH_VERTEX* k_end = j->cloth_work.vtxarg.data() + j->cloth_work.vtxarg.size(); + const CLOTH_VERTEX* k_begin = j->cloth_work.vtxarg.data() + j->cloth_work.width; + const CLOTH_VERTEX* k_end = j->cloth_work.vtxarg.data() + j->cloth_work.vtxarg.size(); size_t l = 0; - for (CLOTH_VERTEX* k = k_begin; k != k_end; k++, l++) { - opd_node_data.data()[l].x.resize(frame_count); - opd_node_data.data()[l].y.resize(frame_count); - opd_node_data.data()[l].z.resize(frame_count); + for (const CLOTH_VERTEX* k = k_begin; k != k_end; k++, l++) { + opd_node_data.data()[l].x.resize(frame_max); + opd_node_data.data()[l].y.resize(frame_max); + opd_node_data.data()[l].z.resize(frame_max); } } } - frame_index = 0; - this->frame_count = frame_count; + frame = 0; + this->frame_max = frame_max; init = true; - this->motion_id = motion_id; + this->motnum = motnum; } void opd_chara_data::open_opd_file() { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; p_farc_write* opd = this->opd; for (int32_t i = 0; i < RPK_ITEM_MAX; i++, opd++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; const char* ram_osage_play_data_tmp_path = get_ram_osage_play_data_tmp_dir(); path_create_directory(ram_osage_play_data_tmp_path); - std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, chara_id); + std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, rob_id); if (!path_check_directory_exists(chara_dir.c_str())) path_create_directory(chara_dir.c_str()); @@ -17586,23 +18486,22 @@ void opd_chara_data::open_opd_file() { } void opd_chara_data::open_opdi_file() { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; p_farc_write* opdi = this->opdi; for (int32_t i = 0; i < RPK_ITEM_MAX; i++, opdi++) { - rob_chara_item_equip_object* skin_disp - = rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i)); if (!skin_disp->osage_nodes_count) continue; const char* ram_osage_play_data_tmp_path = get_ram_osage_play_data_tmp_dir(); path_create_directory(ram_osage_play_data_tmp_path); - std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, rob_chr->chara_id); + std::string chara_dir = sprintf_s_string("%s/%d", ram_osage_play_data_tmp_path, rob_chr->idnm); if (!path_check_directory_exists(chara_dir.c_str())) path_create_directory(chara_dir.c_str()); @@ -17617,22 +18516,22 @@ void opd_chara_data::open_opdi_file() { void opd_chara_data::reset() { init = false; - motion_id = -1; - frame_index = 0; - frame_count = 0; + motnum = -1; + frame = 0; + frame_max = 0; field_18 = 0; for (int32_t i = 0; i < RPK_ITEM_MAX; i++) opd_data[i].clear(); } void opd_chara_data::write_file() { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); if (!rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; for (int32_t i = 0; i < RPK_ITEM_MAX; i++) - if (rob_disp->get_skin_disp((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i))->osage_nodes_count) + if (disp->get_skin_work((ROB_PARTS_KIND)(RPK_ITEM_BEGIN + i))->osage_nodes_count) opd[i].write_file(); } @@ -17696,9 +18595,9 @@ void OsagePlayDataManager::AppendCharaMotionId(rob_chara* rob_chr, const std::ve if (CheckTaskReady() || !rob_chr) return; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* disp = rob_chr->disp; for (int32_t i = RPK_ITEM_BEGIN; i < RPK_ITEM_END; i++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + const RobSkinDisp* skin_disp = disp->get_skin_work((ROB_PARTS_KIND)i); if (!skin_disp || skin_disp->obj_uid.is_null() || (!skin_disp->osage_blk.size() && !skin_disp->cloth.size())) continue; @@ -17713,11 +18612,11 @@ bool OsagePlayDataManager::CheckTaskReady() { } void OsagePlayDataManager::GetOpdFileData(object_info obj_info, - uint32_t motion_id, const float_t*& data, uint32_t& count) { + uint32_t motnum, const float_t*& data, uint32_t& count) { data = 0; count = 0; - auto elem = file_data.find({ obj_info, motion_id }); + auto elem = file_data.find({ obj_info, motnum }); if (elem != file_data.end()) { data = elem->second.data; count = elem->second.head.frame_count; @@ -17752,7 +18651,7 @@ void OsagePlayDataManager::LoadOpdFile(p_file_handler* pfhndl) { opd_file_data data; if (opd_decode_data(pfhndl->get_data(), data.data, data.head)) file_data.insert({ { object_info(data.head.obj_info.first, - data.head.obj_info.second), data.head.motion_id }, data }); + data.head.obj_info.second), data.head.motnum }, data }); } void OsagePlayDataManager::LoadOpdFileList() { @@ -17935,11 +18834,11 @@ void osage_play_data_database_struct::reset() { map.clear(); } -inline rob_osage_mothead_data::rob_osage_mothead_data(mothead_data_type type, - uint32_t motion_id, const motion_database* mot_db) { - data = 0; +inline rob_osage_mothead_data::rob_osage_mothead_data(int32_t type, + uint32_t motnum, const motion_database* mot_db) { + pp_list = 0; this->type = type; - data = mothead_storage_get_mot_by_motion_id(motion_id, mot_db)->data; + pp_list = mothead_storage_get_mot_by_motion_id(motnum, mot_db)->pp_list; init = true; } @@ -17947,37 +18846,37 @@ inline rob_osage_mothead_data::~rob_osage_mothead_data() { } -inline const mothead_data* rob_osage_mothead_data::find_next_data() { - if (!data) +inline MhpList* rob_osage_mothead_data::find_next_data() { + if (!pp_list) return 0; if (init) init = false; else - data++; + pp_list++; - const mothead_data* data = this->data; - if (data && data->type >= MOTHEAD_DATA_TYPE_0) { - mothead_data_type type = data->type; + MhpList* pp_list = this->pp_list; + if (pp_list && pp_list->type >= 0) { + int32_t type = pp_list->type; while (type != this->type) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) { - data = 0; + pp_list++; + type = pp_list->type; + if (type < 0) { + pp_list = 0; break; } } } else - data = 0; + pp_list = 0; - this->data = data; - return data; + this->pp_list = pp_list; + return pp_list; } -rob_osage_mothead::rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, uint32_t motion_id, +rob_osage_mothead::rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, uint32_t motnum, float_t frame, const bone_database* bone_data, const motion_database* mot_db) : rob_chr(), - motion_id(), frame(), last_frame(), + motnum(), frame(), last_frame(), rob_parts_adjust(), rob_parts_adjust_data(), rob_adjust_global(), rob_adjust_global_data(), sleeve_adjust(), sleeve_adjust_data(), disable_collision(), disable_collision_data(), rob_chara_coli_ring(), rob_chara_coli_ring_data(), field_68() { @@ -17988,11 +18887,11 @@ rob_osage_mothead::rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, ui rob_chara_coli_ring = 0; this->rob_chr = rob_chr; if (rob_chr) { - rob_chr->set_motion_id(motion_id, frame, 0.0f, + rob_chr->replace_rob_motion(motnum, frame, 0.0f, true, false, MOTION_BLEND_CROSS, bone_data, mot_db); this->frame = frame; - this->motion_id = motion_id; - last_frame = rob_chr->bone_data->get_frame_count() - 1.0f; + this->motnum = motnum; + last_frame = rob_chr->bone_data->get_frame_max() - 1.0f; rob_chr->set_stage_data_ring(stage_index); rob_chr->reset_osage(); rob_chr->set_bone_data_frame(frame); @@ -18007,9 +18906,9 @@ rob_osage_mothead::rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, ui #if OPD_PLAY_GEN rob_osage_mothead::rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, - uint32_t motion_id, float_t frame, bool set_motion_reset_data, + uint32_t motnum, float_t frame, bool set_motion_reset_data, const bone_database* bone_data, const motion_database* mot_db) : rob_chr(), - motion_id(), frame(), last_frame(), + motnum(), frame(), last_frame(), rob_parts_adjust(), rob_parts_adjust_data(), rob_adjust_global(), rob_adjust_global_data(), sleeve_adjust(), sleeve_adjust_data(), disable_collision(), disable_collision_data(), rob_chara_coli_ring(), rob_chara_coli_ring_data(), field_68() { @@ -18020,11 +18919,11 @@ rob_osage_mothead::rob_osage_mothead(rob_chara* rob_chr, int32_t stage_index, rob_chara_coli_ring = 0; this->rob_chr = rob_chr; if (rob_chr) { - rob_chr->set_motion_id(motion_id, frame, 0.0f, + rob_chr->replace_rob_motion(motnum, frame, 0.0f, true, set_motion_reset_data, MOTION_BLEND_CROSS, bone_data, mot_db); this->frame = frame; - this->motion_id = motion_id; - last_frame = rob_chr->bone_data->get_frame_count() - 1.0f; + this->motnum = motnum; + last_frame = rob_chr->bone_data->get_frame_max() - 1.0f; rob_chr->set_stage_data_ring(stage_index); rob_chr->reset_osage(); rob_chr->set_bone_data_frame(frame); @@ -18058,7 +18957,7 @@ void rob_osage_mothead::ctrl() { // 0x14053D3E0 void rob_osage_mothead::reset() { rob_chr = 0; - motion_id = -1; + motnum = -1; frame = 0.0f; last_frame = 0.0f; reset_data(); @@ -18068,19 +18967,19 @@ void rob_osage_mothead::reset() { void rob_osage_mothead::init_data(const motion_database* mot_db) { reset_data(); - rob_parts_adjust = new rob_osage_mothead_data(MOTHEAD_DATA_ROB_PARTS_ADJUST, motion_id, mot_db); + rob_parts_adjust = new rob_osage_mothead_data(MHP_ROB_PARTS_ADJUST, motnum, mot_db); rob_parts_adjust_data = rob_parts_adjust->find_next_data(); - rob_adjust_global = new rob_osage_mothead_data(MOTHEAD_DATA_ROB_ADJUST_GLOBAL, motion_id, mot_db); + rob_adjust_global = new rob_osage_mothead_data(MHP_ROB_ADJUST_GLOBAL, motnum, mot_db); rob_adjust_global_data = rob_adjust_global->find_next_data(); - sleeve_adjust = new rob_osage_mothead_data(MOTHEAD_DATA_SLEEVE_ADJUST, motion_id, mot_db); + sleeve_adjust = new rob_osage_mothead_data(MHP_SLEEVE_ADJUST, motnum, mot_db); sleeve_adjust_data = sleeve_adjust->find_next_data(); - disable_collision = new rob_osage_mothead_data(MOTHEAD_DATA_DISABLE_COLLISION, motion_id, mot_db); + disable_collision = new rob_osage_mothead_data(MHP_DISABLE_COLLISION, motnum, mot_db); disable_collision_data = disable_collision->find_next_data(); - rob_chara_coli_ring = new rob_osage_mothead_data(MOTHEAD_DATA_ROB_CHARA_COLI_RING, motion_id, mot_db); + rob_chara_coli_ring = new rob_osage_mothead_data(MHP_ROB_CHARA_COLI_RING, motnum, mot_db); rob_chara_coli_ring_data = rob_chara_coli_ring->find_next_data(); } @@ -18113,8 +19012,8 @@ void rob_osage_mothead::reset_data() { } // 0x14053EC90 -void rob_osage_mothead::set_coli_ring(const mothead_data* mhd_data) { - const void* data = mhd_data->data; +void rob_osage_mothead::set_coli_ring(MhpList* list) { + const void* data = list->data; rob_chara_set_coli_ring(rob_chr, ((int8_t*)data)[0]); } @@ -18126,8 +19025,8 @@ void rob_osage_mothead::set_frame(float_t value) { } // 0x14053E7C0 -void rob_osage_mothead::set_disable_collision(const mothead_data* mhd_data) { - const void* data = mhd_data->data; +void rob_osage_mothead::set_disable_collision(MhpList* list) { + const void* data = list->data; rob_chr->set_disable_collision((rob_osage_parts)((uint8_t*)data)[0], !!((uint8_t*)data)[1]); } @@ -18181,19 +19080,19 @@ void rob_osage_mothead::set_mothead_frame() { } // 0x14053EA00 -void rob_osage_mothead::set_rob_adjust_global(const mothead_data* mhd_data) { - const void* data = mhd_data->data; +void rob_osage_mothead::set_rob_adjust_global(MhpList* list) { + const void* data = list->data; rob_chara_data_adjust v14; v14.reset(); int8_t type = ((int8_t*)data)[4]; if (type >= 0 && type < 6) { - float_t set_frame = (float_t)mhd_data->frame; + float_t set_frame = (float_t)list->frame; v14.enable = true; v14.frame = frame - set_frame; v14.transition_frame = frame - set_frame; - v14.motion_id = rob_chr->data.motion.motion_id; + v14.motnum = rob_chr->rob_base.robmot.num; v14.set_frame = set_frame; v14.transition_duration = (float_t)((int32_t*)data)[0]; v14.type = type; @@ -18214,19 +19113,19 @@ void rob_osage_mothead::set_rob_adjust_global(const mothead_data* mhd_data) { } // 0x14053E810 -void rob_osage_mothead::set_rob_parts_adjust(const mothead_data* mhd_data) { - const void* data = mhd_data->data; +void rob_osage_mothead::set_rob_parts_adjust(MhpList* list) { + const void* data = list->data; rob_chara_data_adjust v16; v16.reset(); int8_t type = ((int8_t*)data)[5]; if (type >= 0 && type < 6) { - float_t set_frame = (float_t)mhd_data->frame; + float_t set_frame = (float_t)list->frame; v16.enable = true; v16.frame = frame - set_frame; v16.transition_frame = frame - set_frame; - v16.motion_id = rob_chr->data.motion.motion_id; + v16.motnum = rob_chr->rob_base.robmot.num; v16.set_frame = set_frame; v16.transition_duration = (float_t)((int32_t*)data)[0]; v16.type = type; @@ -18248,14 +19147,14 @@ void rob_osage_mothead::set_rob_parts_adjust(const mothead_data* mhd_data) { v16.strength_transition = (float_t)((int32_t*)data)[15]; } else - rob_chr->rob_disp->reset_nodes_ex_force((rob_osage_parts)((uint8_t*)data)[4]); + rob_chr->disp->reset_nodes_ex_force((rob_osage_parts)((uint8_t*)data)[4]); rob_chara_set_parts_adjust_by_index(rob_chr, (rob_osage_parts)((uint8_t*)data)[4], &v16); } // 0x14053EBE0 -void rob_osage_mothead::set_sleeve_adjust(const mothead_data* mhd_data) { - const void* data = mhd_data->data; +void rob_osage_mothead::set_sleeve_adjust(MhpList* list) { + const void* data = list->data; bool v5 = false; bool v6 = false; @@ -18296,20 +19195,20 @@ OpdMakeManager::CharaData::~CharaData() { void OpdMakeManager::CharaData::AddCostumes(const std::list>& costumes) { for (const std::pair& i : costumes) { - const item_cos_data* cos = item_table_handler_array_get_item_cos_data(i.first, i.second); - for (int32_t j = 0; j < ITEM_SUB_MAX; j++) { - int32_t item_no = cos->arr[j]; + const RobItemEquip* item_set = get_default_costume_data(i.first, i.second); + for (int32_t j = 0; j < ROB_ITEM_EQUIP_SUB_ID_MAX; j++) { + uint32_t item_no = item_set->item_no[j]; if (!item_no) continue; - const item_table_item* item = item_table_handler_array_get_item(i.first, item_no); - if (!item) + const RobItemTable* tbl = get_rob_item_table(i.first, item_no); + if (!tbl) continue; - if (!(item->attr & 0x0C)) + if (!(tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX))) chara_costumes[i.first].items[j].push_back(item_no); - else if (item->org_itm) - chara_costumes[i.first].items[j].push_back(item->org_itm); + else if (tbl->org_itm) + chara_costumes[i.first].items[j].push_back(tbl->org_itm); } } } @@ -18317,33 +19216,33 @@ void OpdMakeManager::CharaData::AddCostumes(const std::list& customize_items) { for (const std::string& i : customize_items) { CHARA_NUM chara_num = CN_MAX; - int32_t item_no = 0; + uint32_t item_no = 0; customize_item_table_handler_data_get_chara_item(i, chara_num, item_no); if (chara_num >= CN_MAX || !item_no) continue; - const item_table_item* item = item_table_handler_array_get_item(chara_num, item_no); - if (!item) + const RobItemTable* tbl = get_rob_item_table(chara_num, item_no); + if (!tbl) continue; - if (!(item->attr & 0x0C)) - chara_costumes[chara_num].items[item->sub_id].push_back(item_no); - else if (item->org_itm) - chara_costumes[chara_num].items[item->sub_id].push_back(item->org_itm); + if (!(tbl->attr & (ROB_ITEM_ATTR_COL | ROB_ITEM_ATTR_TEX))) + chara_costumes[chara_num].items[tbl->equip_sub_id].push_back(item_no); + else if (tbl->org_itm) + chara_costumes[chara_num].items[tbl->equip_sub_id].push_back(tbl->org_itm); } } bool OpdMakeManager::CharaData::CheckNoItems(CHARA_NUM chara_num) { std::vector* chara_items = chara_costumes[chara_num].items; - for (int32_t i = 0; i < ITEM_SUB_MAX; i++, chara_items++) + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++, chara_items++) if (chara_items->size()) return false; return true; } -void OpdMakeManager::CharaData::PopItems(CHARA_NUM chara_num, int32_t items[ITEM_SUB_MAX]) { +void OpdMakeManager::CharaData::PopItems(CHARA_NUM chara_num, int32_t items[ROB_ITEM_EQUIP_SUB_ID_MAX]) { std::vector* chara_items = chara_costumes[chara_num].items; - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) { + for (int32_t i = 0; i < ROB_ITEM_EQUIP_SUB_ID_MAX; i++) { items[i] = 0; if (!chara_items[i].size()) continue; @@ -18356,7 +19255,7 @@ void OpdMakeManager::CharaData::PopItems(CHARA_NUM chara_num, int32_t items[ITEM void OpdMakeManager::CharaData::Reset() { for (int32_t i = 0; i < CN_MAX; i++) - for (int32_t j = 0; j < ITEM_SUB_MAX; j++) + for (int32_t j = 0; j < ROB_ITEM_EQUIP_SUB_ID_MAX; j++) chara_costumes[i].items[j].clear(); left = 0; @@ -18365,7 +19264,7 @@ void OpdMakeManager::CharaData::Reset() { void OpdMakeManager::CharaData::SortUnique() { for (int32_t i = 0; i < CN_MAX; i++) - for (int32_t j = 0; j < ITEM_SUB_MAX; j++) { + for (int32_t j = 0; j < ROB_ITEM_EQUIP_SUB_ID_MAX; j++) { prj::sort_unique(chara_costumes[i].items[j]); count += chara_costumes[i].items[j].size(); } @@ -18377,14 +19276,14 @@ OpdMakeManager::OpdMakeManager() : mode(), workers() { mode = 0; chara = CN_MIKU; - int32_t chara_id = 0; - for (OpdMakeWorker*& i : workers) - i = new OpdMakeWorker(chara_id++); + int32_t rob_id = 0; + for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) + workers[i] = new OpdMakeWorker((ROB_ID)rob_id++); motion_ids.clear(); data.workers.resize(OPD_MAKE_COUNT); for (OpdMakeManagerData::Worker& i : data.workers) { - i.items.resize(ITEM_SUB_MAX); + i.items.resize(ROB_ITEM_EQUIP_SUB_ID_MAX); for (uint32_t& j : i.items) j = 0; } @@ -18393,9 +19292,9 @@ OpdMakeManager::OpdMakeManager() : mode(), workers() { } OpdMakeManager::~OpdMakeManager() { - for (OpdMakeWorker*& i : workers) { - delete i; - i = 0; + for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) { + delete workers[i]; + workers[i] = 0; } } @@ -18468,9 +19367,9 @@ bool OpdMakeManager::ctrl() { if (has_items) { for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) { - rob_chara_pv_data pv_data; - pv_data.type = ROB_CHARA_TYPE_3; - rob_chara_array_init_chara_num(chara, pv_data, 499, false); + RobInit rob_init; + rob_init.rob_type = ROB_TYPE_DATA_TEST; + get_rob_management()->create_rob(chara, rob_init, 499, false); } mode = 6; } @@ -18480,7 +19379,7 @@ bool OpdMakeManager::ctrl() { case 6: { bool wait = false; for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) - if (!task_rob_manager_check_chara_loaded(i)) + if (!task_rob_manager_check_chara_loaded((ROB_ID)i)) wait = true; if (!wait) { @@ -18489,16 +19388,15 @@ bool OpdMakeManager::ctrl() { } } break; case 7: { - int32_t j = 0; - for (OpdMakeWorker*& i : workers) - if (rob_chara_array_get(j++)) - i->add_task(use_current_skp); + for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) + if (rob_chara_array_get((ROB_ID)i++)) + workers[i]->add_task(use_current_skp); mode = 8; } break; case 8: { bool wait = false; - for (OpdMakeWorker*& i : workers) - if (app::TaskWork::check_task_ready(i)) + for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) + if (app::TaskWork::check_task_ready(workers[i])) wait = true; if (!wait) @@ -18506,7 +19404,7 @@ bool OpdMakeManager::ctrl() { } break; case 9: for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) - rob_chara_array_free_chara_id(i); + get_rob_management()->dest_rob((ROB_ID)i); task_rob_manager->run(); mode = 10; break; @@ -18532,13 +19430,13 @@ bool OpdMakeManager::ctrl() { } bool OpdMakeManager::dest() { - for (OpdMakeWorker*& i : workers) - if (app::TaskWork::check_task_ready(i)) + for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) + if (app::TaskWork::check_task_ready(workers[i])) return false; if (!use_current_skp) { for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) - rob_chara_array_free_chara_id(i); + get_rob_management()->dest_rob((ROB_ID)i); for (int32_t i = 0; i < ROB_ID_MAX; i++) skin_param_manager_reset(i); @@ -18589,8 +19487,8 @@ void OpdMakeManager::add_task(const OpdMakeManagerArgs& args) { } bool OpdMakeManager::del_task() { - for (OpdMakeWorker*& i : workers) - i->del_task(); + for (int32_t i = 0; i < OPD_MAKE_COUNT; i++) + workers[i]->del_task(); return app::Task::del(); } @@ -18616,11 +19514,11 @@ void ReqData::Reset() { count = 0; } -ReqDataObj::ReqDataObj() : ReqData(chara_num, count), cos() { +ReqDataObj::ReqDataObj() : item_set() { } -ReqDataObj::ReqDataObj(CHARA_NUM chara_num, int32_t count) : ReqData(chara_num, count), cos() { +ReqDataObj::ReqDataObj(CHARA_NUM chara_num, int32_t count) : ReqData(chara_num, count), item_set() { } @@ -18630,10 +19528,24 @@ ReqDataObj::~ReqDataObj() { void ReqDataObj::Reset() { ReqData::Reset(); - cos = {}; + item_set = {}; } -rob_chara_age_age_data::rob_chara_age_age_data() : part_id(), field_14(), +// 0x1405333E0 +void RobMhPp::exec_func(int32_t type, MhpList*& play_prog, int64_t frame, const motion_database* mot_db) { + if (type < 0 || type >= MHP_MAX || !functbl[type].func) + return; + + if (!(functbl[type].exec_flag & PPFEF_BF_SKIP) || frame <= 0) + (this->*functbl[type].func)(play_prog->data, play_prog, (int32_t)frame, mot_db); + else { + frame -= play_prog->frame; + if (frame <= 1) + (this->*functbl[type].func)(play_prog->data, play_prog, (int32_t)frame, mot_db); + } +} + +rob_chara_age_age_data::rob_chara_age_age_data() : part(), field_14(), rot_z(), field_1C(), rot_speed(), gravity(), alpha(), alive() { index = -1; scale = 1.0f; @@ -18642,7 +19554,7 @@ rot_z(), field_1C(), rot_speed(), gravity(), alpha(), alive() { void rob_chara_age_age_data::reset() { index = -1; - part_id = 0; + part = 0; pos = 0.0f; field_14 = 0.0f; rot_z = 0.0f; @@ -18683,7 +19595,7 @@ void rob_chara_age_age_object::calc_vertex(rob_chara_age_age_object_vertex*& vtx vtx_data = vtx; } -void rob_chara_age_age_object::disp(render_context* rctx, size_t chara_num, +void rob_chara_age_age_object::disp(render_context* rctx, size_t id, bool npr, bool reflect, const vec3& a5, bool chara_color) { int32_t disp_count = this->disp_count; if (!objset_info || !disp_count) @@ -18726,7 +19638,7 @@ void rob_chara_age_age_object::disp(render_context* rctx, size_t chara_num, enum_or(flags, mdl::OBJ_CHARA_REFLECT); rctx->disp_manager->set_obj_flags(flags); rctx->disp_manager->set_chara_color(chara_color); - rctx->disp_manager->set_shadow_group(chara_num ? SHADOW_GROUP_STAGE : SHADOW_GROUP_CHARA); + rctx->disp_manager->set_shadow_group(id ? SHADOW_GROUP_STAGE : SHADOW_GROUP_CHARA); rctx->disp_manager->entry_obj_by_obj(mat4_identity, &obj, &get_obj_set_texture(), &obj_vert_buf, &obj_index_buf, 0, 1.0f); } @@ -19024,7 +19936,7 @@ void rob_chara_age_age::ctrl(mat4& mat) { } for (rob_chara_age_age_data& j : data) - if (j.part_id == 1 || j.part_id == 2) { + if (j.part == 1 || j.part == 2) { if (frame >= 200.0f) frame = 0.0f; @@ -19047,9 +19959,9 @@ void rob_chara_age_age::ctrl(mat4& mat) { void rob_chara_age_age::ctrl_data(rob_chara_age_age_data* data, mat4& mat) { const rob_chara_age_age_init_data* init_data; - if (data->part_id == 1) + if (data->part == 1) init_data = &rob_chara_age_age_init_data_left[data->index]; - else if (data->part_id == 2) + else if (data->part == 2) init_data = &rob_chara_age_age_init_data_right[data->index]; else return; @@ -19069,7 +19981,7 @@ void rob_chara_age_age::ctrl_data(rob_chara_age_age_data* data, mat4& mat) { if (vec3::length(v15) <= 1.0f) { data->pos = v15; data->field_14 = 0.0f; - data->rot_z = data->part_id == 1 ? -0.1f : 0.1f; + data->rot_z = data->part == 1 ? -0.1f : 0.1f; data->field_1C = 0; data->rot_speed = init_data->rot_speed; mat4_mul_translate(&data->mat, &init_data->pos, &data->mat); @@ -19145,7 +20057,7 @@ void rob_chara_age_age::ctrl_skip() { frame = 0.0f; for (int32_t i = 0; i < 200; i++, frame += 1.0f) for (rob_chara_age_age_data& j : data) - if (j.part_id == 1 || j.part_id == 2) { + if (j.part == 1 || j.part == 2) { if (frame >= 200.0f) frame = 0.0f; @@ -19153,10 +20065,10 @@ void rob_chara_age_age::ctrl_skip() { } } -void rob_chara_age_age::disp(render_context* rctx, size_t chara_id, +void rob_chara_age_age::disp(render_context* rctx, size_t id, bool npr, bool reflect, const vec3& a5, bool chara_color) { if (alpha >= 0.1f && visible) - object.disp(rctx, chara_id, npr || this->npr, reflect, a5, chara_color); + object.disp(rctx, id, npr || this->npr, reflect, a5, chara_color); } void rob_chara_age_age::load(object_info obj_info, rob_chara_age_age_data* data, int32_t count) { @@ -19392,16 +20304,16 @@ void rob_sleeve_handler::read() { } osage_set_motion::osage_set_motion() { - motion_id = -1; + motnum = -1; } osage_set_motion::~osage_set_motion() { } -void osage_set_motion::init_frame(uint32_t motion_id, float_t frame, int32_t stage_index) { +void osage_set_motion::init_frame(uint32_t motnum, float_t frame, int32_t stage_index) { frames.clear(); - this->motion_id = motion_id; + this->motnum = motnum; frames.push_back(frame, stage_index); } @@ -19414,7 +20326,7 @@ y(y), z(z), rotation(rotation) { } -PvOsageManager::PvOsageManager() : state(), chara_id(), reset(), field_74(), +PvOsageManager::PvOsageManager() : state(), rob_id(), reset(), field_74(), motion_index(), pv(), thread(), display(), not_reset(), exit(), field_D4() { Reset(); @@ -19479,27 +20391,27 @@ void PvOsageManager::disp() { } void PvOsageManager::AddMotionFrameResetData(int32_t stage_index, - uint32_t motion_id, float_t frame, int32_t iterations) { - if (!CheckResetFrameNotFound(motion_id, frame)) + uint32_t motnum, float_t frame, int32_t init_cnt) { + if (!CheckResetFrameNotFound(motnum, frame)) return; data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); - rob_osage_mothead osg_mhd(rob_chr, stage_index, motion_id, frame, aft_bone_data, aft_mot_db); + rob_osage_mothead osg_mhd(rob_chr, stage_index, motnum, frame, aft_bone_data, aft_mot_db); rob_chr->adjust_ctrl(); rob_chr->rob_motion_modifier_ctrl(); - if (iterations < 0) { - iterations = 60; - if (rob_chr->data.motdata.field_0.iterations > 0) - iterations = rob_chr->data.motdata.field_0.iterations; + if (init_cnt < 0) { + init_cnt = 60; + if (rob_chr->rob_base.motdata.init_cnt > 0) + init_cnt = rob_chr->rob_base.motdata.init_cnt; } - rob_chara_add_motion_reset_data(rob_chr, motion_id, frame, iterations); + rob_chara_add_motion_reset_data(rob_chr, motnum, frame, init_cnt); reset_frames_list.insert({ frame, true }); rob_chr->reset_osage(); @@ -19508,7 +20420,7 @@ void PvOsageManager::AddMotionFrameResetData(int32_t stage_index, rob_chr->set_disable_collision((rob_osage_parts)i, false); } -bool PvOsageManager::CheckResetFrameNotFound(uint32_t motion_id, float_t frame) { +bool PvOsageManager::CheckResetFrameNotFound(uint32_t motnum, float_t frame) { return reset_frames_list.find(frame) == reset_frames_list.end(); } @@ -19532,7 +20444,7 @@ void PvOsageManager::SetNotReset(bool value) { not_reset = value; } -void PvOsageManager::SetPvId(int32_t pv_id, int32_t chara_id, bool reset) { +void PvOsageManager::SetPvId(int32_t pv_id, ROB_ID rob_id, bool reset) { if (!pv_set_motion.size()) return; @@ -19545,7 +20457,7 @@ void PvOsageManager::SetPvId(int32_t pv_id, int32_t chara_id, bool reset) { SetDisplay(true); SetNotReset(false); this->reset = reset; - this->chara_id = chara_id; + this->rob_id = rob_id; sub_1404F77E0(); @@ -19565,7 +20477,7 @@ void PvOsageManager::sub_1404F77E0() { pv_data_set_motion* i_begin = pv_set_motion.data(); pv_data_set_motion* i_end = pv_set_motion.data() + pv_set_motion.size(); for (pv_data_set_motion* i = i_begin, *i_next = i_begin + 1; i != i_end && i_next != i_end; ) - if (i->motion_id == i_next->motion_id + if (i->motnum == i_next->motnum && i->frame_stage_index.first == i_next->frame_stage_index.first) { memmove(i, i_next, sizeof(pv_data_set_motion) * (i_end - i_next)); pv_set_motion.pop_back(); @@ -19579,19 +20491,19 @@ void PvOsageManager::sub_1404F77E0() { osage_set_motion.clear(); - uint32_t motion_id = -1; + uint32_t motnum = -1; ::osage_set_motion* set_motion = 0; for (pv_data_set_motion& i : pv_set_motion) { - if (motion_id != i.motion_id) { + if (motnum != i.motnum) { osage_set_motion.push_back({}); set_motion = &osage_set_motion.back(); - set_motion->motion_id = i.motion_id; + set_motion->motnum = i.motnum; } if (set_motion) set_motion->frames.push_back(i.frame_stage_index); - motion_id = i.motion_id; + motnum = i.motnum; } } @@ -19608,18 +20520,18 @@ void PvOsageManager::sub_1404F7BD0(bool not_reset) { data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - rob_chara* rob_chr = rob_chara_array_get(chara_id); - rob_chr->set_motion_id(rob_chr->get_rob_cmn_mottbl_motion_id(0), + rob_chara* rob_chr = rob_chara_array_get(rob_id); + rob_chr->replace_rob_motion(rob_chr->get_common_mot(MTP_NONE), 0.0f, 0.0f, true, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); - rob_chr->set_face_mottbl_motion(0, 6, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_face_mottbl_motion(0, MTP_FACE_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, true, aft_mot_db); - rob_chr->set_hand_l_mottbl_motion(0, 192, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_hand_l_mottbl_motion(0, MTP_HAND_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_hand_r_mottbl_motion(0, 192, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_hand_r_mottbl_motion(0, MTP_HAND_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_mouth_mottbl_motion(0, 131, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_mouth_mottbl_motion(0, MTP_KUCHI_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_eyes_mottbl_motion(0, 165, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, + rob_chr->set_eyes_mottbl_motion(0, MTP_EYES_NULL, 0.0f, ROB_PARTIAL_MOTION_PLAYBACK_NONE, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); rob_chr->set_eyelid_mottbl_motion_from_face(0, 0.0f, -1.0f, 0.0f, aft_mot_db); } @@ -19628,7 +20540,7 @@ void PvOsageManager::sub_1404F7BD0(bool not_reset) { void PvOsageManager::Reset() { state = 1; - chara_id = -1; + rob_id = ROB_ID_NULL; reset = true; pv = 0; reset_frames_list.clear(); @@ -19661,12 +20573,12 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - rob_chara* rob_chr = rob_chara_array_get(chara_id); - float_t last_frame = (float_t)(int32_t)rob_chr->bone_data->get_frame_count() - 1.0f; + rob_chara* rob_chr = rob_chara_array_get(rob_id); + float_t last_frame = (float_t)(int32_t)rob_chr->bone_data->get_frame_max() - 1.0f; if (!a2->frames.size()) return; - uint32_t motion_id = a2->motion_id; + uint32_t motnum = a2->motnum; bool v32 = false; std::vector v34; @@ -19679,7 +20591,7 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { frame -= last_frame; while (frame >= last_frame); } - if (CheckResetFrameNotFound(motion_id, frame)) { + if (CheckResetFrameNotFound(motnum, frame)) { v34.push_back(frame); reset_frames_list.insert({ frame, true }); } @@ -19688,11 +20600,11 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { if (!v34.size() || v34.front() > last_frame) return; - int32_t iterations = 60; - if (rob_chr->data.motdata.field_0.iterations > 0) - iterations = rob_chr->data.motdata.field_0.iterations; + int32_t init_cnt = 60; + if (rob_chr->rob_base.motdata.init_cnt > 0) + init_cnt = rob_chr->rob_base.motdata.init_cnt; - float_t frame = v34.front() - (float_t)iterations + 1.0f; + float_t frame = v34.front() - (float_t)init_cnt + 1.0f; while (frame < 0.0f) frame += last_frame; @@ -19703,7 +20615,7 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { if (frame_1 < 0.0f) frame_1 = last_frame - 1.0f; - rob_osage_mothead osg_mhd(rob_chr, a2->frames.front().second, motion_id, frame_1, aft_bone_data, aft_mot_db); + rob_osage_mothead osg_mhd(rob_chr, a2->frames.front().second, motnum, frame_1, aft_bone_data, aft_mot_db); float_t* i_begin = v34.data(); float_t* i_end = v34.data() + v34.size(); for (float_t* i = i_begin; i != i_end; ) { @@ -19713,11 +20625,11 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { float_t frame_1 = frame; frame = prj::floorf(frame) + 1.0f; - if (iterations <= 1) { + if (init_cnt <= 1) { if (frame_1 == *i) { if (frame_1 == 0.0f && v32) - rob_chara_add_motion_reset_data(rob_chr, motion_id, last_frame, 0); - rob_chara_add_motion_reset_data(rob_chr, motion_id, frame_1, 0); + rob_chara_add_motion_reset_data(rob_chr, motnum, last_frame, 0); + rob_chara_add_motion_reset_data(rob_chr, motnum, frame_1, 0); i++; continue; } @@ -19725,7 +20637,7 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { frame = *i; } else - iterations--; + init_cnt--; if (frame >= last_frame) { frame = 0.0f; @@ -19738,12 +20650,12 @@ void PvOsageManager::sub_1404F83A0(::osage_set_motion* a2) { rob_chr->set_disable_collision((rob_osage_parts)i, false); } -void PvOsageManager::sub_1404F88A0(uint32_t stage_index, uint32_t motion_id, float_t frame) { - if (!CheckResetFrameNotFound(motion_id, frame)) +void PvOsageManager::sub_1404F88A0(uint32_t stage_index, uint32_t motnum, float_t frame) { + if (!CheckResetFrameNotFound(motnum, frame)) return; ::osage_set_motion v7; - v7.init_frame(motion_id, frame, stage_index); + v7.init_frame(motnum, frame, stage_index); sub_1404F83A0(&v7); } @@ -19752,54 +20664,54 @@ void PvOsageManager::sub_1404F8AA0() { return; ::osage_set_motion& v4 = osage_set_motion.back(); - uint32_t motion_id = v4.motion_id; - if (motion_id == -1) + uint32_t motnum = v4.motnum; + if (motnum == -1) return; data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_chara_array_get(rob_id); reset_frames_list.clear(); - rob_chr->set_motion_id(motion_id, 0.0f, 0.0f, + rob_chr->replace_rob_motion(motnum, 0.0f, 0.0f, true, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); if (pv) for (const pv_db_pv_osage_init& i : pv->osage_init) { int32_t osage_init_motion_id = aft_mot_db->get_motion_id(i.motion.c_str()); - if (osage_init_motion_id != -1 && osage_init_motion_id == motion_id) { - if (rob_chr->data.motdata.field_0.field_58 == 1) + if (osage_init_motion_id != -1 && osage_init_motion_id == motnum) { + if (rob_chr->rob_base.motdata.next_type == MH_NEXT_REPEAT) sub_1404F88A0(i.stage, osage_init_motion_id, (float_t)i.frame); else AddMotionFrameResetData(i.stage, osage_init_motion_id, (float_t)i.frame, -1); } } - if (rob_chr->data.motdata.field_0.field_58 == 1) { + if (rob_chr->rob_base.motdata.next_type == MH_NEXT_REPEAT) { sub_1404F83A0(&v4); } else { bool v12 = true; - const mothead_data* data = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->data; - if (data && data->type >= MOTHEAD_DATA_TYPE_0) { - mothead_data_type type = data->type; - while (type != MOTHEAD_DATA_OSAGE_RESET) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + MhpList* pp_list = mothead_storage_get_mot_by_motion_id(motnum, aft_mot_db)->pp_list; + if (pp_list && pp_list->type >= 0) { + int32_t type = pp_list->type; + while (type != MHP_OSAGE_RESET) { + pp_list++; + type = pp_list->type; + if (type < 0) goto LABEL_1; } - while (data->frame) { - data++; - mothead_data_type type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + while (pp_list->frame) { + pp_list++; + int32_t type = pp_list->type; + if (type < 0) goto LABEL_1; - while (type != MOTHEAD_DATA_OSAGE_RESET) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + while (type != MHP_OSAGE_RESET) { + pp_list++; + type = pp_list->type; + if (type < 0) goto LABEL_1; } } @@ -19811,37 +20723,37 @@ void PvOsageManager::sub_1404F8AA0() { if (GetNotReset()) break; else if (v12 || i.first != 0.0f) - AddMotionFrameResetData(i.second, motion_id, i.first, -1); + AddMotionFrameResetData(i.second, motnum, i.first, -1); if (v12) - AddMotionFrameResetData(0, motion_id, 0.0f, -1); + AddMotionFrameResetData(0, motnum, 0.0f, -1); - data = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->data; - if (data && data->type >= MOTHEAD_DATA_TYPE_0) { - mothead_data_type type = data->type; - while (type != MOTHEAD_DATA_MOTION_SKIN_PARAM) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + pp_list = mothead_storage_get_mot_by_motion_id(motnum, aft_mot_db)->pp_list; + if (pp_list && pp_list->type >= 0) { + int32_t type = pp_list->type; + while (type != MHP_MOTION_SKIN_PARAM) { + pp_list++; + type = pp_list->type; + if (type < 0) return; } while (true) { - int32_t iterations = 60; - if (data->data) - iterations = *(int32_t*)data->data; + int32_t init_cnt = 60; + if (pp_list->data) + init_cnt = *(int32_t*)pp_list->data; - AddMotionFrameResetData(0, motion_id, (float_t)data->frame, iterations); + AddMotionFrameResetData(0, motnum, (float_t)pp_list->frame, init_cnt); - data++; - mothead_data_type type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + pp_list++; + int32_t type = pp_list->type; + if (type < 0) break; - while (type != MOTHEAD_DATA_MOTION_SKIN_PARAM) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + while (type != MHP_MOTION_SKIN_PARAM) { + pp_list++; + type = pp_list->type; + if (type < 0) return; } } @@ -19898,11 +20810,11 @@ RobThreadParent::~RobThreadParent() { thread = 0; } -void RobThreadParent::AppendRobCharaFunc(rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)) { +void RobThreadParent::AppendRobCharaFunc(rob_chara* rob_chr, void(*func)(rob_chara*)) { std::unique_lock u_lock(mtx); RobThread thrd; thrd.data = rob_chr; - thrd.func = rob_chr_func; + thrd.func = func; AppendRobThread(&thrd); cnd.notify_one(); } @@ -19968,9 +20880,9 @@ RobThreadHandler::~RobThreadHandler() { } } -void RobThreadHandler::AppendRobCharaFunc(int32_t chara_id, - rob_chara* rob_chr, void(*rob_chr_func)(rob_chara*)) { - arr[chara_id]->AppendRobCharaFunc(rob_chr, rob_chr_func); +void RobThreadHandler::AppendRobCharaFunc(ROB_ID rob_id, + rob_chara* rob_chr, void(*func)(rob_chara*)) { + arr[rob_id]->AppendRobCharaFunc(rob_chr, func); } RobImplTask::RobImplTask() { @@ -19998,12 +20910,12 @@ void RobImplTask::disp() { } void RobImplTask::AppendList(rob_chara* rob_chr, std::list* list) { - if (!rob_chr || !list || rob_chr->chara_id >= ROB_ID_MAX || list->size() >= ROB_ID_MAX) + if (!rob_chr || !list || rob_chr->idnm >= ROB_ID_MAX || list->size() >= ROB_ID_MAX) return; bool found = false; for (rob_chara*& i : *list) - if (i->chara_id == rob_chr->chara_id) { + if (i->idnm == rob_chr->idnm) { found = true; break; } @@ -20024,13 +20936,13 @@ void RobImplTask::AppendInitCharaList(rob_chara* rob_chr) { AppendList(rob_chr, &init_chara); } -void RobImplTask::FreeList(int8_t* chara_id, std::list* list) { - if (!chara_id || !list || *chara_id >= ROB_ID_MAX || !list->size()) +void RobImplTask::FreeList(int8_t* idnm, std::list* list) { + if (!idnm || !list || *idnm >= ROB_ID_MAX || !list->size()) return; for (auto i = list->begin(); i != list->end();) { rob_chara* rob_chr = *i; - if (rob_chr->chara_id == *chara_id) + if (rob_chr->idnm == *idnm) i = list->erase(i); else i++; @@ -20043,16 +20955,16 @@ void RobImplTask::FreeCharaLists() { free_chara.clear(); } -void RobImplTask::FreeCtrlCharaList(int8_t* chara_id) { - FreeList(chara_id, &ctrl_chara); +void RobImplTask::FreeCtrlCharaList(int8_t* idnm) { + FreeList(idnm, &ctrl_chara); } -void RobImplTask::FreeFreeCharaList(int8_t* chara_id) { - FreeList(chara_id, &free_chara); +void RobImplTask::FreeFreeCharaList(int8_t* idnm) { + FreeList(idnm, &free_chara); } -void RobImplTask::FreeInitCharaList(int8_t* chara_id) { - FreeList(chara_id, &init_chara); +void RobImplTask::FreeInitCharaList(int8_t* idnm) { + FreeList(idnm, &init_chara); } TaskRobBase::TaskRobBase() { @@ -20079,13 +20991,13 @@ bool TaskRobBase::ctrl() { for (rob_chara*& i : ctrl_chara) if (i) - rob_thread_handler->AppendRobCharaFunc(i->chara_id, + rob_thread_handler->AppendRobCharaFunc((ROB_ID)i->idnm, i, rob_base_rob_chara_ctrl_thread_main); rob_thread_handler->sub_14054E3F0(); for (rob_chara*& i : ctrl_chara) - if (i && !i->data.flag.bit.rf_31) + if (i && !i->rob_base.flag.bit.no_ctrl) rob_base_rob_chara_ctrl(i); for (rob_chara*& i : free_chara) @@ -20115,11 +21027,11 @@ bool TaskRobBase::dest() { return true; } -bool TaskRobBase::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +bool TaskRobBase::check_type(RobType type) { + return type >= ROB_TYPE_PLAYER && type <= ROB_TYPE_AUTH; } -bool TaskRobBase::is_frame_dependent() { +bool TaskRobBase::sync() { return true; } @@ -20148,7 +21060,7 @@ bool TaskRobCollision::ctrl() { } /*for (rob_chara*& i : ctrl_chara) - if (i && !i->data.flag.bit.rf_31) + if (i && !i->rob_base.flag.bit.no_ctrl) sub_14050EA90(v13);*/ } @@ -20161,11 +21073,11 @@ bool TaskRobCollision::dest() { return true; } -bool TaskRobCollision::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +bool TaskRobCollision::check_type(RobType type) { + return type >= ROB_TYPE_PLAYER && type <= ROB_TYPE_AUTH; } -bool TaskRobCollision::is_frame_dependent() { +bool TaskRobCollision::sync() { return true; } @@ -20195,12 +21107,12 @@ bool TaskRobDisp::ctrl() { init_chara.clear(); for (rob_chara*& i : ctrl_chara) - if (i && !i->data.flag.bit.rf_31) + if (i && !i->rob_base.flag.bit.no_ctrl) rob_disp_rob_chara_ctrl(i); for (rob_chara*& i : ctrl_chara) - if (i && !i->data.flag.bit.rf_31) - rob_thread_handler->AppendRobCharaFunc(i->chara_id, i, + if (i && !i->rob_base.flag.bit.no_ctrl) + rob_thread_handler->AppendRobCharaFunc((ROB_ID)i->idnm, i, rob_disp_rob_chara_ctrl_thread_main); rob_thread_handler->sub_14054E3F0(); @@ -20237,19 +21149,19 @@ bool TaskRobDisp::dest() { void TaskRobDisp::disp() { for (rob_chara*& i : ctrl_chara) { - if (!i || pv_osage_manager_array_get_disp(i->chara_id)) + if (!i || pv_osage_manager_array_get_disp((ROB_ID)i->idnm)) continue; - if (i->is_visible() && !i->data.flag.bit.rf_31) + if (i->get_disp_flag() && !i->rob_base.flag.bit.no_ctrl) rob_disp_rob_chara_disp(i); } } -bool TaskRobDisp::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_3; +bool TaskRobDisp::check_type(RobType type) { + return type >= 0 && type < ROB_TYPE_MAX; } -bool TaskRobDisp::is_frame_dependent() { +bool TaskRobDisp::sync() { return false; } @@ -20271,7 +21183,7 @@ bool TaskRobInfo::ctrl() { init_chara.clear(); for (rob_chara*& i : ctrl_chara) - if (i && !i->data.flag.bit.rf_31) + if (i && !i->rob_base.flag.bit.no_ctrl) i->rob_info_ctrl(); free_chara.clear(); @@ -20283,11 +21195,11 @@ bool TaskRobInfo::dest() { return true; } -bool TaskRobInfo::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +bool TaskRobInfo::check_type(RobType type) { + return type >= ROB_TYPE_PLAYER && type <= ROB_TYPE_AUTH; } -bool TaskRobInfo::is_frame_dependent() { +bool TaskRobInfo::sync() { return true; } @@ -20346,79 +21258,79 @@ bool TaskRobLoad::dest() { return true; } -bool TaskRobLoad::AppendFreeReqData(CHARA_NUM chara_num) { - if (chara_num < CN_MIKU || chara_num > CN_TETO) +bool TaskRobLoad::AppendFreeReqData(CHARA_NUM cn) { + if (cn < CN_MIKU || cn > CN_TETO) return false; for (auto i = load_req_data.end(); i != load_req_data.begin(); ) { i--; - if (i->chara_num == chara_num) { + if (i->chara_num == cn) { i = load_req_data.erase(i); return true; } } ReqData value; - value.chara_num = chara_num; + value.chara_num = cn; free_req_data.push_back(value); return true; } -bool TaskRobLoad::AppendFreeReqDataObj(CHARA_NUM chara_num, const item_cos_data* cos) { - if (chara_num < CN_MIKU || chara_num > CN_TETO) +bool TaskRobLoad::AppendFreeReqDataObj(CHARA_NUM cn, const RobItemEquip* item_set) { + if (cn < CN_MIKU || cn > CN_TETO) return false; for (auto i = load_req_data_obj.end(); i != load_req_data_obj.begin(); ) { i--; - if (i->chara_num == chara_num - && !memcmp(&i->cos, cos, sizeof(item_cos_data))) { + if (i->chara_num == cn + && !memcmp(&i->item_set, item_set, sizeof(RobItemEquip))) { i = load_req_data_obj.erase(i); return true; } } ReqDataObj value; - value.chara_num = chara_num; - value.cos = *cos; + value.chara_num = cn; + value.item_set = *item_set; free_req_data_obj.push_back(value); return true; } -bool TaskRobLoad::AppendLoadReqData(CHARA_NUM chara_num) { - if (chara_num < CN_MIKU || chara_num > CN_TETO) +bool TaskRobLoad::AppendLoadReqData(CHARA_NUM cn) { + if (cn < CN_MIKU || cn > CN_TETO) return false; for (auto i = free_req_data.end(); i != free_req_data.begin(); ) { i--; - if (i->chara_num == chara_num) { + if (i->chara_num == cn) { i = free_req_data.erase(i); return true; } } ReqData value; - value.chara_num = chara_num; + value.chara_num = cn; value.count = 1; load_req_data.push_back(value); return true; } -bool TaskRobLoad::AppendLoadReqDataObj(CHARA_NUM chara_num, const item_cos_data* cos) { - if (chara_num < CN_MIKU || chara_num > CN_TETO) +bool TaskRobLoad::AppendLoadReqDataObj(CHARA_NUM cn, const RobItemEquip* item_set) { + if (cn < CN_MIKU || cn > CN_TETO) return false; for (auto i = free_req_data_obj.end(); i != free_req_data_obj.begin(); ) { i--; - if (i->chara_num == chara_num - && !memcmp(&i->cos, cos, sizeof(item_cos_data))) { + if (i->chara_num == cn + && !memcmp(&i->item_set, item_set, sizeof(RobItemEquip))) { i = free_req_data_obj.erase(i); return true; } } ReqDataObj value; - value.chara_num = chara_num; - value.cos = *cos; + value.chara_num = cn; + value.item_set = *item_set; value.count = 1; load_req_data_obj.push_back(value); return true; @@ -20438,7 +21350,7 @@ void TaskRobLoad::AppendLoadedReqData(ReqData* req_data) { void TaskRobLoad::AppendLoadedReqDataObj(ReqDataObj* req_data_obj) { for (ReqDataObj& i : loaded_req_data_obj) if (i.chara_num == req_data_obj->chara_num - && !memcmp(&i.cos, &req_data_obj->cos, sizeof(item_cos_data))) { + && !memcmp(&i.item_set, &req_data_obj->item_set, sizeof(RobItemEquip))) { if (i.count != 0x7FFFFFFF) i.count++; return; @@ -20460,7 +21372,7 @@ int32_t TaskRobLoad::CtrlFunc3() { int32_t ret = -1; if (free_req_data_obj.size()) { for (ReqDataObj& i : free_req_data_obj) { - UnloadCharaItemsParent(i.chara_num, &i.cos); + UnloadCharaItems(i.chara_num, &i.item_set); FreeLoadedReqDataObj(&i); } free_req_data_obj.clear(); @@ -20481,7 +21393,7 @@ int32_t TaskRobLoad::CtrlFunc3() { if (load_req_data_obj.size()) { for (ReqDataObj& i : load_req_data_obj) { AppendLoadedReqDataObj(&i); - LoadCharaItemsParent(i.chara_num, &i.cos, aft_data, aft_obj_db); + LoadCharaItems(i.chara_num, &i.item_set, aft_data, aft_obj_db); load_item_req_data_obj.push_back(i); } load_req_data_obj.clear(); @@ -20503,7 +21415,7 @@ int32_t TaskRobLoad::CtrlFunc3() { int32_t TaskRobLoad::CtrlFunc4() { if (load_item_req_data_obj.size()) { for (ReqDataObj& i : load_item_req_data_obj) - if (LoadCharaItemsCheckNotReadParent(i.chara_num, &i.cos)) + if (LoadCharaItemsCheckNotReadParent(i.chara_num, &i.item_set)) return -1; load_item_req_data_obj.clear(); } @@ -20537,7 +21449,7 @@ void TaskRobLoad::FreeLoadedReqData(ReqData* req_data) { void TaskRobLoad::FreeLoadedReqDataObj(ReqDataObj* req_data_obj) { for (auto i = loaded_req_data_obj.begin(); i != loaded_req_data_obj.end(); i++) if (i->chara_num == req_data_obj->chara_num - && !memcmp(&i->cos, &req_data_obj->cos, sizeof(item_cos_data))) { + && !memcmp(&i->item_set, &req_data_obj->item_set, sizeof(RobItemEquip))) { if (i->count > 0) i->count--; @@ -20547,73 +21459,38 @@ void TaskRobLoad::FreeLoadedReqDataObj(ReqDataObj* req_data_obj) { } } -void TaskRobLoad::LoadCharaItem(CHARA_NUM chara_num, - int32_t item_no, void* data, const object_database* obj_db) { - if (!item_no) - return; - - const std::vector* item_objset - = item_table_handler_array_get_item_objset(chara_num, item_no); - if (!item_objset) - return; - - for (uint32_t i : *item_objset) - if (i != (uint32_t)-1) - objset_info_storage_load_set(data, obj_db, i); -} - -bool TaskRobLoad::LoadCharaItemCheckNotRead(CHARA_NUM chara_num, int32_t item_no) { - if (!item_no) - return false; - - const std::vector* item_objset - = item_table_handler_array_get_item_objset(chara_num, item_no); - if (!item_objset) - return true; - - for (uint32_t i : *item_objset) - if (i != (uint32_t)-1 && objset_info_storage_load_obj_set_check_not_read(i)) +bool TaskRobLoad::LoadCharaItemsCheckNotRead(CHARA_NUM cn, RobItemEquip* item_set) { + for (uint32_t& i : item_set->item_no) + if (RobItem::s_wait_obj(cn, i)) return true; return false; } -void TaskRobLoad::LoadCharaItems(CHARA_NUM chara_num, - item_cos_data* cos, void* data, const object_database* obj_db) { - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) - LoadCharaItem(chara_num, cos->arr[i], data, obj_db); +bool TaskRobLoad::LoadCharaItemsCheckNotReadParent(CHARA_NUM cn, RobItemEquip* item_set) { + return TaskRobLoad::LoadCharaItemsCheckNotRead(cn, item_set) + || item_set->item_no[ROB_ITEM_EQUIP_SUB_ID_KAMI] == 649 + && objset_info_storage_load_obj_set_check_not_read(3291); } -bool TaskRobLoad::LoadCharaItemsCheckNotRead(CHARA_NUM chara_num, item_cos_data* cos) { - for (int32_t& i : cos->arr) - if (LoadCharaItemCheckNotRead(chara_num, i)) - return true; - return false; -} - -bool TaskRobLoad::LoadCharaItemsCheckNotReadParent(CHARA_NUM chara_num, item_cos_data* cos) { - return TaskRobLoad::LoadCharaItemsCheckNotRead(chara_num, cos) - || cos->data.kami == 649 && objset_info_storage_load_obj_set_check_not_read(3291); -} - -void TaskRobLoad::LoadCharaItemsParent(CHARA_NUM chara_num, - item_cos_data* cos, void* data, const object_database* obj_db) { - LoadCharaItems(chara_num, cos, data, obj_db); - if (cos->data.kami == 649) +void TaskRobLoad::LoadCharaItems(CHARA_NUM cn, + RobItemEquip* item_set, void* data, const object_database* obj_db) { + RobItem::s_req_obj_all(cn, item_set, data, obj_db); + if (item_set->item_no[ROB_ITEM_EQUIP_SUB_ID_KAMI] == 649) objset_info_storage_load_set(data, obj_db, 3291); } -void TaskRobLoad::LoadCharaObjSetMotionSet(CHARA_NUM chara_num, +void TaskRobLoad::LoadCharaObjSetMotionSet(CHARA_NUM cn, void* data, const object_database* obj_db, const motion_database* mot_db) { - const RobData* rob_data = get_rob_data(chara_num); - objset_info_storage_load_set(data, obj_db, rob_data->object_set); + const RobData* rob_data = get_rob_data(cn); + objset_info_storage_load_set(data, obj_db, rob_data->objset); motion_set_load_motion(cmn_set_id, "", mot_db); motion_set_load_mothead(cmn_set_id, "", mot_db); motion_set_load_motion(rob_data->motfile, "", mot_db); } -bool TaskRobLoad::LoadCharaObjSetMotionSetCheck(CHARA_NUM chara_num) { - const RobData* rob_data = get_rob_data(chara_num); - if (objset_info_storage_load_obj_set_check_not_read(rob_data->object_set) +bool TaskRobLoad::LoadCharaObjSetMotionSetCheck(CHARA_NUM cn) { + const RobData* rob_data = get_rob_data(cn); + if (objset_info_storage_load_obj_set_check_not_read(rob_data->objset) || motion_storage_check_mot_file_not_ready(cmn_set_id) || mothead_storage_check_mhd_file_not_ready(cmn_set_id)) return true; @@ -20634,34 +21511,15 @@ void TaskRobLoad::ResetReqDataObj() { loaded_req_data_obj.clear(); } -void TaskRobLoad::UnloadCharaItem(CHARA_NUM chara_num, int32_t item_no) { - if (!item_no) - return; - - const std::vector* item_objset - = item_table_handler_array_get_item_objset(chara_num, item_no); - if (!item_objset) - return; - - for (uint32_t i : *item_objset) - if (i != (uint32_t)-1) - objset_info_storage_unload_set(i); -} - -void TaskRobLoad::UnloadCharaItems(CHARA_NUM chara_num, item_cos_data* cos) { - for (int32_t i = 0; i < ITEM_SUB_MAX; i++) - UnloadCharaItem(chara_num, cos->arr[i]); -} - -void TaskRobLoad::UnloadCharaItemsParent(CHARA_NUM chara_num, item_cos_data* cos) { - if (cos->data.kami == 649) +void TaskRobLoad::UnloadCharaItems(CHARA_NUM cn, RobItemEquip* item_set) { + if (item_set->item_no[ROB_ITEM_EQUIP_SUB_ID_KAMI] == 649) objset_info_storage_unload_set(3291); - UnloadCharaItems(chara_num, cos); + RobItem::s_free_obj_all(cn, item_set); } -void TaskRobLoad::UnloadCharaObjSetMotionSet(CHARA_NUM chara_num) { - const RobData* rob_data = get_rob_data(chara_num); - objset_info_storage_unload_set(rob_data->object_set); +void TaskRobLoad::UnloadCharaObjSetMotionSet(CHARA_NUM cn) { + const RobData* rob_data = get_rob_data(cn); + objset_info_storage_unload_set(rob_data->objset); motion_set_unload_motion(cmn_set_id); motion_set_unload_mothead(cmn_set_id); motion_set_unload_motion(rob_data->motfile); @@ -20670,7 +21528,7 @@ void TaskRobLoad::UnloadCharaObjSetMotionSet(CHARA_NUM chara_num) { void TaskRobLoad::UnloadLoadedChara() { for (ReqDataObj& i : loaded_req_data_obj) for (int32_t j = i.count; j; j--) - UnloadCharaItemsParent(i.chara_num, &i.cos); + UnloadCharaItems(i.chara_num, &i.item_set); loaded_req_data_obj.clear(); @@ -20682,7 +21540,7 @@ void TaskRobLoad::UnloadLoadedChara() { } TaskRobManager::TaskRobManager() : ctrl_state(), dest_state() { - + reset_list(); } TaskRobManager::~TaskRobManager() { @@ -20691,19 +21549,20 @@ TaskRobManager::~TaskRobManager() { bool TaskRobManager::init() { task_rob_load_add_task(); - rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); - for (; rob_impls1->task; rob_impls1++) { - RobImplTask* task = rob_impls1->task; - app::TaskWork::add_task(task, rob_impls1->name); - task->frame_dependent = task->is_frame_dependent(); + + const RobTaskList* list_before = get_rob_manager_list_before(this); + for (; list_before->task; list_before++) { + RobImplTask* task = list_before->task; + app::TaskWork::add_task(task, list_before->name); + task->frame_dependent = task->sync(); task->FreeCharaLists(); } - rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); - for (; rob_impls2->task; rob_impls2++) { - RobImplTask* task = rob_impls2->task; - app::TaskWork::add_task(task, rob_impls2->name); - task->frame_dependent = task->is_frame_dependent(); + const RobTaskList* list_after = get_rob_manager_list_after(this); + for (; list_after->task; list_after++) { + RobImplTask* task = list_after->task; + app::TaskWork::add_task(task, list_after->name); + task->frame_dependent = task->sync(); task->FreeCharaLists(); } @@ -20722,7 +21581,7 @@ bool TaskRobManager::ctrl() { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; for (rob_chara*& i : load_chara) { - i->reset_data(&i->pv_data, aft_bone_data, aft_mot_db); + i->reset_rob(i->rob_init, aft_bone_data, aft_mot_db); AppendLoadedCharaList(i); } CheckTypeAppendInitCharaLists(&load_chara); @@ -20736,28 +21595,30 @@ bool TaskRobManager::ctrl() { if (free_chara.size()) { for (rob_chara*& i : free_chara) { task_rob_load_append_free_req_data(i->chara_num); - task_rob_load_append_free_req_data_obj(i->chara_num, i->item_cos_data.get_cos()); - FreeLoadedCharaList(&i->chara_id); + task_rob_load_append_free_req_data_obj(i->chara_num, i->item.get_equip()); + FreeLoadedCharaList(&i->idnm); } for (rob_chara*& i : free_chara) { - rob_chara_type type = i->type; - for (rob_manager_rob_impl* j = rob_manager_rob_impls1_get(this); j->task; j++) { - if (!j->task->check_type(type)) + RobType type = i->type; + const RobTaskList* list_before = get_rob_manager_list_before(this); + for (; list_before->task; list_before++) { + if (!list_before->task->check_type(type)) continue; - j->task->FreeInitCharaList(&i->chara_id); - j->task->FreeCtrlCharaList(&i->chara_id); - j->task->AppendFreeCharaList(i); + list_before->task->FreeInitCharaList(&i->idnm); + list_before->task->FreeCtrlCharaList(&i->idnm); + list_before->task->AppendFreeCharaList(i); } - for (rob_manager_rob_impl* j = rob_manager_rob_impls2_get(this); j->task; j++) { - if (!j->task->check_type(type)) + const RobTaskList* list_after = get_rob_manager_list_after(this); + for (; list_after->task; list_after++) { + if (!list_after->task->check_type(type)) continue; - j->task->FreeInitCharaList(&i->chara_id); - j->task->FreeCtrlCharaList(&i->chara_id); - j->task->AppendFreeCharaList(i); + list_after->task->FreeInitCharaList(&i->idnm); + list_after->task->FreeCtrlCharaList(&i->idnm); + list_after->task->AppendFreeCharaList(i); } } free_chara.clear(); @@ -20770,7 +21631,7 @@ bool TaskRobManager::ctrl() { load_chara.push_back(i); task_rob_load_append_load_req_data(i->chara_num); - task_rob_load_append_load_req_data_obj(i->chara_num, i->item_cos_data.get_cos()); + task_rob_load_append_load_req_data_obj(i->chara_num, i->item.get_equip()); } init_chara.clear(); ctrl_state = 0; @@ -20781,13 +21642,13 @@ bool TaskRobManager::ctrl() { bool TaskRobManager::dest() { switch (dest_state) { case 0: { - rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); - for (; rob_impls1->task; rob_impls1++) - rob_impls1->task->del(); + const RobTaskList* list_before = get_rob_manager_list_before(this); + for (; list_before->task; list_before++) + list_before->task->del(); - rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); - for (; rob_impls2->task; rob_impls2++) - rob_impls2->task->del(); + const RobTaskList* list_after = get_rob_manager_list_after(this); + for (; list_after->task; list_after++) + list_after->task->del(); init_chara.clear(); load_chara.clear(); @@ -20811,12 +21672,12 @@ void TaskRobManager::disp() { } void TaskRobManager::AppendFreeCharaList(rob_chara* rob_chr) { - if (!rob_chr || rob_chr->chara_id >= ROB_ID_MAX || free_chara.size() >= ROB_ID_MAX) + if (!rob_chr || rob_chr->idnm >= ROB_ID_MAX || free_chara.size() >= ROB_ID_MAX) return; - int32_t chara_id = rob_chr->chara_id; + int32_t idnm = rob_chr->idnm; for (auto i = init_chara.begin(); i != init_chara.end();) - if ((*i)->chara_id == chara_id) { + if ((*i)->idnm == idnm) { i = init_chara.erase(i); return; } @@ -20825,14 +21686,14 @@ void TaskRobManager::AppendFreeCharaList(rob_chara* rob_chr) { bool loaded_chara_found = false; for (rob_chara*& i : loaded_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { loaded_chara_found = true; break; } bool load_chara_found = false; for (rob_chara*& i : load_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { load_chara_found = true; break; } @@ -20842,7 +21703,7 @@ void TaskRobManager::AppendFreeCharaList(rob_chara* rob_chr) { bool free_chara_found = false; for (rob_chara*& i : free_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { free_chara_found = true; break; } @@ -20852,20 +21713,20 @@ void TaskRobManager::AppendFreeCharaList(rob_chara* rob_chr) { } void TaskRobManager::AppendInitCharaList(rob_chara* rob_chr) { - if (!rob_chr || rob_chr->chara_id >= ROB_ID_MAX || init_chara.size() >= ROB_ID_MAX) + if (!rob_chr || rob_chr->idnm >= ROB_ID_MAX || init_chara.size() >= ROB_ID_MAX) return; - int32_t chara_id = rob_chr->chara_id; + int32_t idnm = rob_chr->idnm; bool loaded_chara_found = false; for (rob_chara*& i : loaded_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { loaded_chara_found = true; break; } bool load_chara_found = false; for (rob_chara*& i : load_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { load_chara_found = true; break; } @@ -20875,7 +21736,7 @@ void TaskRobManager::AppendInitCharaList(rob_chara* rob_chr) { bool init_chara_found = false; for (rob_chara*& i : init_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { init_chara_found = true; break; } @@ -20885,13 +21746,13 @@ void TaskRobManager::AppendInitCharaList(rob_chara* rob_chr) { } void TaskRobManager::AppendLoadedCharaList(rob_chara* rob_chr) { - if (!rob_chr || rob_chr->chara_id >= ROB_ID_MAX || loaded_chara.size() >= ROB_ID_MAX) + if (!rob_chr || rob_chr->idnm >= ROB_ID_MAX || loaded_chara.size() >= ROB_ID_MAX) return; - int32_t chara_id = rob_chr->chara_id; + int32_t idnm = rob_chr->idnm; bool loaded_chara_found = false; for (rob_chara*& i : loaded_chara) - if (i->chara_id == chara_id) { + if (i->idnm == idnm) { loaded_chara_found = true; break; } @@ -20902,27 +21763,27 @@ void TaskRobManager::AppendLoadedCharaList(rob_chara* rob_chr) { bool TaskRobManager::CheckCharaLoaded(rob_chara* rob_chr) { if (!app::TaskWork::check_task_ready(this) - || rob_chr->chara_id < 0 || rob_chr->chara_id >= ROB_ID_MAX) + || rob_chr->idnm < 0 || rob_chr->idnm >= ROB_ID_MAX) return false; - int8_t chara_id = rob_chr->chara_id; + int8_t idnm = rob_chr->idnm; for (rob_chara*& i : free_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return false; for (rob_chara*& i : loaded_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return true; return false; } bool TaskRobManager::CheckHasRobCharaLoad(rob_chara* rob_chr) { - if (!rob_chr || rob_chr->chara_id >= ROB_ID_MAX || !load_chara.size()) + if (!rob_chr || rob_chr->idnm >= ROB_ID_MAX || !load_chara.size()) return false; - int32_t chara_id = rob_chr->chara_id; + int32_t idnm = rob_chr->idnm; for (rob_chara*& i : load_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return true; return false; @@ -20930,29 +21791,29 @@ bool TaskRobManager::CheckHasRobCharaLoad(rob_chara* rob_chr) { void TaskRobManager::CheckTypeAppendInitCharaLists(std::list* rob_chr_list) { for (rob_chara*& i : *rob_chr_list) { - rob_chara_type type = i->type; - rob_manager_rob_impl* rob_impls1 = rob_manager_rob_impls1_get(this); - for (; rob_impls1->task; rob_impls1++) { - RobImplTask* task = rob_impls1->task; + RobType type = i->type; + const RobTaskList* list_before = get_rob_manager_list_before(this); + for (; list_before->task; list_before++) { + RobImplTask* task = list_before->task; if (task->check_type(type)) task->AppendInitCharaList(i); } - rob_manager_rob_impl* rob_impls2 = rob_manager_rob_impls2_get(this); - for (; rob_impls2->task; rob_impls2++) { - RobImplTask* task = rob_impls2->task; + const RobTaskList* list_after = get_rob_manager_list_after(this); + for (; list_after->task; list_after++) { + RobImplTask* task = list_after->task; if (task->check_type(type)) task->AppendInitCharaList(i); } } } -void TaskRobManager::FreeLoadedCharaList(int8_t* chara_id) { - if (!chara_id || *chara_id >= ROB_ID_MAX || !loaded_chara.size()) +void TaskRobManager::FreeLoadedCharaList(int8_t* idnm) { + if (!idnm || *idnm >= ROB_ID_MAX || !loaded_chara.size()) return; for (auto i = loaded_chara.begin(); i != loaded_chara.end();) - if ((*i)->chara_id == *chara_id) { + if ((*i)->idnm == *idnm) { i = loaded_chara.erase(i); return; } @@ -20973,29 +21834,36 @@ bool TaskRobManager::GetWait(rob_chara* rob_chr) { if (!app::TaskWork::check_task_ready(this)) return false; - int32_t chara_id = rob_chr->chara_id; - if (chara_id < 0 || chara_id >= ROB_ID_MAX) + int32_t idnm = rob_chr->idnm; + if (idnm < 0 || idnm >= ROB_ID_MAX) return false; for (auto& i : init_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return true; for (auto& i : load_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return true; for (auto& i : loaded_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return true; for (auto& i : free_chara) - if (i->chara_id == chara_id) + if (i->idnm == idnm) return true; return false; } +void TaskRobManager::reset_list() { + init_chara.clear(); + load_chara.clear(); + free_chara.clear(); + loaded_chara.clear(); +} + TaskRobMotionModifier::TaskRobMotionModifier() { } @@ -21009,69 +21877,82 @@ bool TaskRobMotionModifier::init() { } static void sub_1405484A0(rob_chara* rob_chr) { - rob_chr->data.motion.step_data.field_4 = rob_chr->data.motion.step_data.frame; + rob_chr->rob_base.robmot.step.old_f = rob_chr->rob_base.robmot.step.f; - if (rob_chr->data.motion.step_data.step < 0.0f) - rob_chr->data.motion.step_data.frame = 1.0f; + if (rob_chr->rob_base.robmot.step.req_f < 0.0f) + rob_chr->rob_base.robmot.step.f = 1.0f; else - rob_chr->data.motion.step_data.frame = rob_chr->data.motion.step_data.step; + rob_chr->rob_base.robmot.step.f = rob_chr->rob_base.robmot.step.req_f; - rob_chara_bone_data_set_step(rob_chr->bone_data, rob_chr->data.motion.step_data.frame); + rob_chara_bone_data_set_step(rob_chr->bone_data, rob_chr->rob_base.robmot.step.f); - float_t step = rob_chr->data.motion.step; - if (step < 0.0f) - step = rob_chr->data.motion.step_data.frame; - rob_chr->rob_disp->set_osage_step(step); + float_t osage_step = rob_chr->rob_base.robmot.osage_step; + if (osage_step < 0.0f) + osage_step = rob_chr->rob_base.robmot.step.f; + rob_chr->disp->set_osage_step(osage_step); - if (!(rob_chr->data.motion.field_28 & 0x40)) { - if (rob_chr->data.action.field_B8.field_7C > 0.0f) - rob_chr->data.motion.step_data.frame = rob_chr->data.action.field_B8.field_80; + if (!rob_chr->rob_base.robmot.flag.bit.frame_ctrl) { + if (rob_chr->rob_base.action.yarare.gs_resist_timer > 0.0f) + rob_chr->rob_base.robmot.step.f = rob_chr->rob_base.action.yarare.gs_resist_step; return; } - if (!rob_chr->data.motdata.field_0.field_298) + if (!rob_chr->rob_base.motdata.frame_ctrl_type) return; - if (!rob_chr->field_20 || rob_chr->data.motion.frame_data.frame >= rob_chr->data.motdata.field_0.field_29C) { - rob_chr->data.motion.step_data.frame = 1.0f; - rob_chr->data.motion.field_28 &= ~0x40; + if (!rob_chr->enemy || rob_chr->rob_base.robmot.frame.f >= rob_chr->rob_base.motdata.frame_ctrl_frame) { + rob_chr->rob_base.robmot.step.f = 1.0f; + rob_chr->rob_base.robmot.flag.bit.frame_ctrl = false; return; } - float_t v6 = 1.0f; - /*size_t v7 = rob_chr->field_20; - if (rob_chr->data.motdata.field_0.field_298 & 0x200 - || (stru_140A2E410[*(int32_t*)(v7 + 6744)][rob_chr->data.motdata.field_0.field_298 & 0xFF] - && *(int32_t*)(v7 + 6736) & 0x02)) { - float_t v11 = rob_chr->data.motdata.field_0.field_2A4; - switch (rob_chr->data.motdata.field_0.field_2A0) { + static const bool stru_140A2E410[][6] = { + { 0, 0, 0, 0, 0, 0 }, + { 1, 1, 0, 1, 0, 0 }, + { 1, 0, 1, 1, 0, 1 }, + { 1, 0, 0, 0, 1, 1 }, + { 1, 0, 1, 1, 0, 1 }, + { 1, 0, 0, 0, 1, 1 }, + { 1, 0, 0, 1, 1, 1 }, + { 1, 1, 0, 1, 0, 1 }, + { 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1 }, + { 1, 0, 0, 0, 1, 1 }, + { 1, 1, 1, 1, 1, 1 }, + }; + + float_t step = 1.0f; + rob_chara* enemy = rob_chr->enemy; +#pragma warning(suppress: 6385) + if (rob_chr->rob_base.motdata.frame_ctrl_type & 0x200 + || (stru_140A2E410[enemy->rob_base.motdata.attack_point][rob_chr->rob_base.motdata.frame_ctrl_type & 0xFF] + && (enemy->rob_base.motdata.attack_kind[ATK_HIT_OK]))) { + float_t v11 = rob_chr->rob_base.motdata.frame_ctrl_tag_add; + switch (rob_chr->rob_base.motdata.frame_ctrl_tag_type) { case 1: - v11 += *(float_t*)(v7 + 6608); + v11 += rob_chr->rob_base.motdata.frame; break; case 2: - v11 += *(float_t*)(v7 + 6720); + v11 += rob_chr->rob_base.motdata.main_mot_frame; break; case 3: - v11 += *(float_t*)(v7 + 6724); + v11 += rob_chr->rob_base.motdata.follow1_frame; break; case 4: - v11 += *(float_t*)(v7 + 6728); + v11 += rob_chr->rob_base.motdata.follow2_frame; break; } - float_t v12 = v11 - *(float_t*)(v7 + 1752); + float_t v12 = v11 - enemy->rob_base.robmot.frame.f; if (v12 > 0.0f) - v6 = (rob_chr->data.motdata.field_0.field_29C - rob_chr->data.motion.frame_data.frame) / v12; - }*/ + step = (rob_chr->rob_base.motdata.frame_ctrl_frame - rob_chr->rob_base.robmot.frame.f) / v12; + } - if (v6 < rob_chr->data.motdata.field_0.field_2A8) - v6 = rob_chr->data.motdata.field_0.field_2A8; - - if (v6 <= rob_chr->data.motdata.field_0.field_2AC) - rob_chr->data.motion.step_data.frame = v6; - else - rob_chr->data.motion.step_data.frame = rob_chr->data.motdata.field_0.field_2AC; - return; + rob_chr->rob_base.robmot.step.f = clamp_def(step, + rob_chr->rob_base.motdata.frame_ctrl_min, rob_chr->rob_base.motdata.frame_ctrl_max); } bool TaskRobMotionModifier::ctrl() { @@ -21100,11 +21981,11 @@ bool TaskRobMotionModifier::dest() { return true; } -bool TaskRobMotionModifier::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +bool TaskRobMotionModifier::check_type(RobType type) { + return type >= ROB_TYPE_PLAYER && type <= ROB_TYPE_AUTH; } -bool TaskRobMotionModifier::is_frame_dependent() { +bool TaskRobMotionModifier::sync() { return true; } @@ -21129,11 +22010,11 @@ bool TaskRobPrepareAction::dest() { return true; } -bool TaskRobPrepareAction::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +bool TaskRobPrepareAction::check_type(RobType type) { + return type >= ROB_TYPE_PLAYER && type <= ROB_TYPE_AUTH; } -bool TaskRobPrepareAction::is_frame_dependent() { +bool TaskRobPrepareAction::sync() { return true; } @@ -21150,31 +22031,31 @@ bool TaskRobPrepareControl::init() { } static void sub_140548660(rob_chara* rob_chr) { - rob_chr->data.motion.frame_data.prev_frame = rob_chr->data.motion.frame_data.frame; + rob_chr->rob_base.robmot.frame.old_f = rob_chr->rob_base.robmot.frame.f; rob_chr->bone_data->motion_step(); - if (rob_chr->data.motion.field_28 & 0x80) - rob_chr->bone_data->set_frame(rob_chr->data.motion.frame_data.last_set_frame); - rob_chr->data.motion.frame_data.frame = rob_chr->bone_data->get_frame(); - rob_chr->data.motion.field_150.face.Step(); - rob_chr->data.motion.field_150.hand_l.Step(); - rob_chr->data.motion.field_150.hand_r.Step(); - rob_chr->data.motion.field_150.mouth.Step(); - rob_chr->data.motion.field_150.eyes.Step(); - rob_chr->data.motion.field_150.eyelid.Step(); - rob_chr->data.motion.field_3B0.face.Step(); - rob_chr->data.motion.field_3B0.hand_l.Step(); - rob_chr->data.motion.field_3B0.hand_r.Step(); - rob_chr->data.motion.field_3B0.mouth.Step(); - rob_chr->data.motion.field_3B0.eyes.Step(); - rob_chr->data.motion.field_3B0.eyelid.Step(); + if (rob_chr->rob_base.robmot.flag.bit.ext_frame_req) + rob_chr->bone_data->set_frame(rob_chr->rob_base.robmot.frame.req_f); + rob_chr->rob_base.robmot.frame.f = rob_chr->bone_data->get_frame(); + rob_chr->rob_base.robmot.field_150.face.Step(); + rob_chr->rob_base.robmot.field_150.hand_l.Step(); + rob_chr->rob_base.robmot.field_150.hand_r.Step(); + rob_chr->rob_base.robmot.field_150.mouth.Step(); + rob_chr->rob_base.robmot.field_150.eyes.Step(); + rob_chr->rob_base.robmot.field_150.eyelid.Step(); + rob_chr->rob_base.robmot.field_3B0.face.Step(); + rob_chr->rob_base.robmot.field_3B0.hand_l.Step(); + rob_chr->rob_base.robmot.field_3B0.hand_r.Step(); + rob_chr->rob_base.robmot.field_3B0.mouth.Step(); + rob_chr->rob_base.robmot.field_3B0.eyes.Step(); + rob_chr->rob_base.robmot.field_3B0.eyelid.Step(); } static void sub_140548460(rob_chara* rob_chr) { - rob_chr->data.flag.bit.old_not_normal = rob_chr->data.flag.bit.not_normal; - if (rob_chr->data.motdata.field_0.field_20.field_0 & 0x01) - rob_chr->data.flag.bit.not_normal = 1; + rob_chr->rob_base.flag.bit.old_not_normal = rob_chr->rob_base.flag.bit.not_normal; + if (rob_chr->rob_base.motdata.motkind[MK_CHANGE]) + rob_chr->rob_base.flag.bit.not_normal = 1; else - rob_chr->data.flag.bit.not_normal = 0; + rob_chr->rob_base.flag.bit.not_normal = 0; } bool TaskRobPrepareControl::ctrl() { @@ -21205,10 +22086,10 @@ bool TaskRobPrepareControl::dest() { return true; } -bool TaskRobPrepareControl::check_type(rob_chara_type type) { - return type >= ROB_CHARA_TYPE_0 && type <= ROB_CHARA_TYPE_2; +bool TaskRobPrepareControl::check_type(RobType type) { + return type >= ROB_TYPE_PLAYER && type <= ROB_TYPE_AUTH; } -bool TaskRobPrepareControl::is_frame_dependent() { +bool TaskRobPrepareControl::sync() { return true; } diff --git a/src/CRE/rob/rob.hpp b/src/CRE/rob/rob.hpp index e419aa40..869753f5 100644 --- a/src/CRE/rob/rob.hpp +++ b/src/CRE/rob/rob.hpp @@ -8,6 +8,7 @@ #include "../../KKdLib/default.hpp" #include "../../KKdLib/database/bone.hpp" #include "../../KKdLib/database/motion.hpp" +#include "../../KKdLib/prj/bit_array.hpp" #include "../../KKdLib/prj/vector_pair.hpp" #include "../../KKdLib/mat.hpp" #include "../../KKdLib/mot.hpp" @@ -19,8 +20,119 @@ #include "../object.hpp" #include "../static_var.hpp" +enum ACT_NAME { + ROB_ACT_NONE = 0, + ROB_ACT_MOTION, + ROB_ACT_KAMAE, + ROB_ACT_YARARE, + ROB_ACT_GUARD, + ROB_ACT_NAGE, + ROB_ACT_NAGERARE, + ROB_ACT_JUMP, + ROB_ACT_DOWN, + ROB_ACT_RISE, + ROB_ACT_UKEMI, + ROB_ACT_GUARD_POSE, + ROB_ACT_RINGOUT, + ROB_ACT_GACHA, + ROB_ACT_WALK, + ROB_ACT_RUN, + ROB_ACT_DASH, + ROB_ACT_SY_DASH, + ROB_ACT_YOKE, + ROB_ACT_ROPEWORK, + ROB_ACT_MAX, +}; + +enum AtkPoint { + AP_NO_ATTACK = 0, + AP_HIGH, + AP_MIDDLE, + AP_LOW, + AP_AIR, + AP_VERY_LOW, + AP_LITTLE_LOW, + AP_LITTLE_HIGH, + AP_NAGEMISS_HIGH, + AP_NAGEMISS_LOW, + AP_NAGEMISS_DOWN, + AP_NAGEMISS_HI_AIR, + AP_DOWN_ATTACK, + AP_AIR_LOW, + AP_AIR_DOWN_ATTACK, + AP_MAX, +}; + +enum AtkUnit { + AU_NO_ATTACK = 0, + AU_KATA_R, + AU_KATA_L, + AU_UDE_R, + AU_UDE_L, + AU_TE_R, + AU_TE_L, + AU_HIZA_R, + AU_HIZA_L, + AU_ASI_R, + AU_ASI_L, + AU_FOOT_R, + AU_FOOT_L, + AU_RYOU_TE, + AU_ASI_ALL_R, + AU_ASI_ALL_L, + AU_SENAKA, + AU_KAO, + AU_KOSI, + AU_MUNE_KAO, + AU_BODY, + AU_RYOU_ASI, + AU_ELBO_R, + AU_ELBO_L, + AU_TE_ALL_R, + AU_TE_ALL_L, + AU_ASI_ALL, + AU_RYOU_HIZA, + AU_TE_ASI_R, + AU_TE_ASI_L, + AU_KATA_MUNE_R, + AU_KATA_MUNE_L, + AU_SHIRI, + AU_KAO_KATA, + AU_RYOU_ASI_HIZA, + AU_RYOU_UDE, + AU_RYOU_TE_ALL, + AU_ZENSHIN, + AU_TETSUZAN, + AU_TETSUZAN_M, + AU_ELBO_HIZA_R, + AU_ELBO_HIZA_L, + AU_RYOU_TE_KOSI, + AU_BUKI_R, + AU_BUKI_L, + AU_KATA_HIZA_R, + AU_KATA_HIZA_L, + AU_KATA_R_HIZA_L, + AU_KATA_L_HIZA_R, + AU_RYOU_HIJI, + AU_RYOU_ASI_TE_R, + AU_RYOU_ASI_TE_L, + AU_ELBO_MUNE_R, + AU_ELBO_MUNE_L, + AU_TE_R_ASI_L, + AU_TE_L_ASI_R, + AU_BODY_TE_R, + AU_BODY_TE_L, + AU_BODY_ASI_R, + AU_BODY_ASI_L, + AU_BODY_TE_ASI_R, + AU_BODY_TE_ASI_L, + AU_RYOU_TE_KAO, + AU_MAX, +}; + enum BONE_BLK { - BLK_DUMMY = -1, + BLK_DUMMY = -1, + BLK_N_HARA_CP = 0x00, BLK_KG_HARA_Y = 0x01, BLK_KL_HARA_XZ = 0x02, @@ -210,7 +322,8 @@ enum BONE_BLK { }; enum BONE_ID { - BONE_ID_DUMMY = -1, + BONE_ID_DUMMY = -1, + BONE_ID_N_HARA_CP = 0x00, BONE_ID_KG_HARA_Y = 0x01, BONE_ID_KL_HARA_XZ = 0x02, @@ -612,6 +725,12 @@ enum BONE_NODE { BONE_NODE_MAX = 0xC9, }; +enum CCmdYkType { + CCMD_YK_TYPE_NON = 0, + CCMD_YK_TYPE_R, + CCMD_YK_TYPE_L, +}; + enum Expr_type { Expr_constant = 0, Expr_variable, @@ -621,42 +740,599 @@ enum Expr_type { Expr_func3, }; -enum ROB_ID { - ROB_ID_1P = 0, - ROB_ID_2P, - ROB_ID_3P, - ROB_ID_4P, - ROB_ID_5P, - ROB_ID_6P, - ROB_ID_MAX, - - ROB_ID_NULL = -1, -}; - -enum ReviseType { - REVISE_NORMAL = 0x0, - REVISE_FAST, - REVISE_SLOW, - REVISE_GUARD, - REVISE_RISE, - REVISE_YARARE, - REVISE_STRISE, - REVISE_SLOW2, - REVISE_ATTACK_FOLLOW, - REVISE_SLOW_GUARD, - REVISE_GUARD2, - REVISE_RISE_SLOW, - REVISE_TYPE_MAX, -}; - enum eyes_base_adjust_type { - EYES_BASE_ADJUST_NONE = -1, + EYES_BASE_ADJUST_NONE = -1, + EYES_BASE_ADJUST_DIRECTION = 0x00, EYES_BASE_ADJUST_CLEARANCE = 0x01, EYES_BASE_ADJUST_OFF = 0x02, EYES_BASE_ADJUST_MAX = 0x03, }; +enum FcurveKeyKind { + FCURVE_KEY_KIND_STATIC_0 = 0, + FCURVE_KEY_KIND_STATIC_DATA, + FCURVE_KEY_KIND_HERMITE, + FCURVE_KEY_KIND_HERMITE_TANGENT, + FCURVE_KEY_KIND_MAX, +}; + +enum GuardKind { + GUARD_KIND_NONE = 0, + GUARD_KIND_TACHI, + GUARD_KIND_SYAGAMI, + GUARD_KIND_ALL, +}; + +enum HyoutanStat { + HYOUTAN_STAT_NORMAL = 0, + HYOUTAN_STAT_RIGHT_HAND, + HYOUTAN_STAT_LEFT_HAND, + HYOUTAN_STAT_MAX, +}; + +enum MhAirKind { + AK_CENTER_MOVE = 0, + AK_KIND_MAX, +}; + +enum MhAtkKind { + ATK_DOWN_ATTACK_OK = 0, + ATK_HIT_OK, + ATK_GUARD, + ATK_REVISE, + ATK_YOROKENAI, + ATK_YOKE_HIT, + ATK_LR_YARARE, + ATK_KIND_MAX, +}; + +enum MhEfcFlag { + ETF_RIGHT = 0, + ETF_LEFT, + ETF_DOWN, + ETF_TA_DOWN, + ETF_COUNTER_DOWN, + ETF_YOROKE_DOWN, + ETF_NO_DOWN, + ETF_NO_GUARD, + ETF_GUARD_HALF, + ETF_GUARD_HAZUSHI_LOW, + ETF_GUARD_HAZUSHI_HIGH, + ETF_FOLLOW_HIT_YOROKE, + ETF_GUARD_YOROKE_HIGH, + ETF_GUARD_YOROKE_LOW, + ETF_YOROKE_HIGH, + ETF_YOROKE_LOW, + ETF_WALL_BREAK, + ETF_COUNTER_YOROKE, + ETF_YOROKE_NO_DOWN, + ETF_URA_DOWN, + ETF_COUNTER_URA_DOWN, + ETF_FOLLOW_HIT_URA_DOWN, + ETF_URA_NO_DOWN, + ETF_FOLLOW_HIT_DOWN, + ETF_S_COUNTER_DOWN, + ETF_S_COUNTER_YOROKE, + ETF_M_COUNTER_DOWN, + ETF_M_COUNTER_YOROKE, + ETF_L_COUNTER_DOWN, + ETF_L_COUNTER_YOROKE, + ETF_YARARE_REV, + ETF_YOKE_GUARD, + ETF_SIDE_DOWN, + ETF_COUNTER_SIDE_DOWN, + ETF_FOLLOW_SIDE_DOWN, + ETF_STRAIGHT, + ETF_REVERSE, + ETF_WALL_FIX, + ETF_NOT_WALL_FIX, + ETF_SIDE_YOROKE, + ETF_URA_YOROKE, + ETF_SIDE_YOROKE_LOW, + ETF_URA_YOROKE_LOW, + ETF_ITAI_DOWN, + ETF_NO_UKEMI, + ETF_STUN, + ETF_COUNTER_STUN, + ETF_FOLLOW_HIT_STUN, + ETF_URA_STUN, + ETF_COUNTER_URA_STUN, + ETF_FOLLOW_HIT_URA_STUN, + ETF_SIDE_STUN, + ETF_COUNTER_SIDE_STUN, + ETF_FOLLOW_HIT_SIDE_STUN, + ETF_STUN_DOWN, + ETF_FOLLOW_HIT_SY_YA, + ETF_NO_CMBXANG_OFFSET, + ETF_BD_COUNTER_DOWN, + ETF_BD_COUNTER_YOROKE, + ETF_NO_COUNTER_DAMAGE, + ETF_NO_HIT_AIR, + ETF_FLAG_MAX, +}; + +enum MhEfcSpeedType { + EST_NORMAL = 0, + EST_EXTRA, + EST_UP_PUNCH, + EST_UP_PUNCH2, + EST_DOWN_ATTACK, + EST_NERICHAGI, + EST_FUTTOBI, + EST_LOW_ATTACK, + EST_HAMMER, + EST_JUMP_PUNCH, + EST_CHAIN_PULL, + EST_SPIN, + EST_RENKAN, + EST_NORMAL2, + EST_MAX, +}; + +enum MhEnDrinkOffType { + MH_EDRK_ATK_ALWAYS = 0, + MH_EDRK_ATK_HIT, + MH_EDRK_ATK_GUARD, + MH_EDRK_DRINK_OFF_MAX, +}; + +enum MhGuardFlag { + GK_BUTTON = 0, + GK_NONE_DC, + GK_NONE_DC_SELECT, + GK_NONE_DC_ALL, + GK_NONE_DC_TA, + GK_NONE_DC_SY, + GK_DC, + GK_DC_SELECT, + GK_DC_ALL, + GK_DC_TA, + GK_DC_SY, + GK_COMA_A, + GK_SIDE, + GK_FLAG_MAX, +}; + +enum MhGuardType { + GK_TYPE_ALL = 0, + GK_TYPE_TA, + GK_TYPE_SY, + GK_TYPE_SEL, + GK_TYPE_MAX, +}; + +enum MhKabeDmgType { + MH_KBD_NORMAL = 0, + MH_KBD_YARARE, + MH_KBD_YOROKE, + MH_KBD_MAX, +}; + +enum MhKaeshiAttrib { + KT_ATTRIB_NONE = 0x0, + KT_ATTRIB_TA_PUNCH, + KT_ATTRIB_SY_PUNCH, + KT_ATTRIB_HIJI, + KT_ATTRIB_HIZA, +}; + +enum MhKaeshiFlag { + KT_PUNCH_KAESHI = 0, + KT_LOW_PUNCH_KAESHI, + KT_KICK_KAESHI, + KT_MID_KICK_KAESHI, + KT_LOW_KICK_KAESHI, + KT_HIJI_KAESHI, + KT_HIZA_KAESHI, + KT_SPIN_K_KAESHI, + KT_LOW_SPIN_K_KAESHI, + KT_SUMMER_KAESHI, + KT_DOWN_PUNCH_KAESHI, + KT_DOWN_KICK_KAESHI, + KT_RYOUTE_KAESHI, + KT_KATA_KAESHI, + KT_TETSUZAN_KAESHI, + KT_HEAD_KAESHI, + KT_TE_TORI, + KT_LOW_PUNCH_TORI, + KT_ASI_TORI, + KT_MID_ASI_TORI, + KT_LOW_ASI_TORI, + KT_HIJI_TORI, + KT_HIZA_TORI, + KT_RYOUASI_TORI, + KT_HIGH, + KT_MIDDLE, + KT_LOW, + KT_BEHIND, + KT_TACHI_NAGE, + KT_SY_GUARD, + KT_GUARD_SHIFT, + KT_LEFT, + KT_FULL_KAESHI, + KT_DOWN_DISABLE, + KT_RESIST_DISABLE, + KT_DISABLE, + KT_TYPE_MAX, +}; + +enum MhMotKind { + MK_CHANGE = 0, + MK_BEGIN, + MK_FOLLOW, + MK_NO_TRANS, + MK_NO_MOVE, + MK_RUN, + MK_AIR, + MK_JUMP, + MK_TURN, + MK_YARARE, + MK_DOWN, + MK_DOWN_POSE, + MK_KAMAE, + MK_SYAGAMI, + MK_ATTACK, + MK_GUARD, + MK_UKEMI, + MK_RISE, + MK_GACHA, + MK_NAGE, + MK_NAGERARE, + MK_DTURN, + MK_BACK, + MK_YOROKE, + MK_RIDE_ON, + MK_YOKE, + MK_AGURA, + MK_SAKADACHI, + MK_FALL, + MK_TSUKAMI, + MK_TSUKAMARE, + MK_MUTEKI, + MK_HAJIKI_HIGH, + MK_HAJIKI_LOW, + MK_NERI, + MK_OIDASANAI, + MK_CHARGE_WHILE, + MK_NO_DEAD, + MK_KAESERU, + MK_DOWN_HIT_ENABLE, + MK_AIR_DOWN, + MK_TUNNELS, + MK_TUNNEL0, + MK_NAGERARERU, + MK_POSE_CANCEL_OK, + MK_NO_FREEZE, + MK_GUARD_NAGERENAI_DC, + MK_NAGE_CHECK_NORMAL, + MK_NAGE_CHECK_KUZURE, + MK_SABAKI, + MK_GACHA_DISP, + MK_KABE_HIT_NG, + MK_WALL_CHECK_RINGOUT, + MK_FALL_RINGOUT_OK, + MK_NO_RINGOUT, + MK_RINGOUT_CHAIN, + MK_NAGE_WALL_BREAK, + MK_RECALC_OIDASHI_VEC, + MK_BACK_SPEED_OFF, + MK_CUT_WALL_SPEED_OFF, + MK_YOKE_R, + MK_YOKE_L, + MK_YOKERENAI, + MK_DOWN_ATTACK_OK, + MK_WALK, + MK_SYAGAMI_WALK, + MK_DASH, + MK_SYAGAMI_DASH, + MK_DOWN_NAGE, + MK_MOVE_FRONT, + MK_MOVE_BACK, + MK_SABAKI_MOTION, + MK_COMBO_NAGE, + MK_COMBO_NAGERARE, + MK_CHARGE_OFF, + MK_CHARGE, + MK_ATEMIKAMAE, + MK_ATEMIWAZA, + MK_NAGENUKE_OK, + MK_NAGENUKE, + MK_SYAGAMI_NAGE, + MK_NAGE_TSUKAMI, + MK_YOKE_ATTACK, + MK_JYOUDAN_KAWASHI, + MK_TOKUJYOU_KAWASHI, + MK_NAGE_FOLLOW_NAGERERU, + MK_RESIST, + MK_ATTACK_FOLLOW, + MK_ATTACK_BEGIN, + MK_FORCE_COUNTER_STRONG, + MK_FORCE_COUNTER_NORMAL, + MK_Y_MOVE, + MK_Y_TRANS, + MK_DMIRROR, + MK_URA_SAKA, + MK_SPD0, + MK_FUMI, + MK_KAO_MUKE, + MK_KAO_MUKENAI, + MK_KAO_MUKERUNA, + MK_WALL_THRUST_EMY, + MK_NEXT_TRANS, + MK_NEXT_Y_TRANS, + MK_BOUND_DOWN, + MK_HEAVY_BOUND_DOWN, + MK_NO_BOUND_DOWN, + MK_REVERSE_ATK, + MK_PL_SYAGAMI, + MK_NOT_PL_SYAGAMI, + MK_LOW_KAWASHI, + MK_REVERSE_HIT_OK, + MK_WALL_REDUCE_DAMAGE, + MK_WALL_DOWN2, + MK_REVERSE_ATK_FRONT, + MK_DOWN_LIKE, + MK_REDUCE_DAMAGE, + MK_IMM_YOKERARE_DISABLE, + MK_OFF_MOVE_L, + MK_OFF_MOVE_R, + MK_NO_CMBXANG_OFFSET, + MK_COLLI_WALL_DISABLE, + MK_NO_AIR, + MK_ITAI, + MK_ASI_LEAF_CTRL, + MK_CATCH_SABAKI_DISABLE, + MK_STUN, + MK_ATTACK_BEGIN2, + MK_KIND_MAX, +}; + +enum MhNextType { + MH_NEXT_NONE = -1, + + MH_NEXT_MOTION = 0, + MH_NEXT_REPEAT, + MH_NEXT_KAMAE, + MH_NEXT_MAKE, + MH_NEXT_NAGE, + MH_NEXT_DOWN_POSE, + MH_NEXT_LOCK, + MH_NEXT_MAX, +}; + +enum MhResistDownChkType { + RESIST_NO_CHK_DOWN = 0, + RESIST_CHK_DOWN, +}; + +enum MhReviseFlag { + MH_REVISE_NO = 0, + MH_REVISE_FORCE, + MH_REVISE_RISE_START, + MH_REVISE_MOT_SLOW, + MH_REVISE_DASH, + MH_REVISE_EMY_NO, + MH_REVISE_GUARD_EMY_NO, + MH_REVISE_ATK_FOLLOW_EMY_NO, + MH_REVISE_NORM_EMY_NO, + MH_REVISE_WALK_EMY_NO, + MH_REVISE_UPDATE_EMY_ATK, + MH_REVISE_FORCE_SLOW2, + MH_REVISE_FORCE_FAST2, + MH_REVISE_GUARD_SLOW, + MH_REVISE_GUARD_EMY_ON, + MH_REVISE_DOWN_ATK, + MH_REVISE_FORCE_SLOW, + MH_REVISE_MAX, +}; + +enum MhSmoothFlag { + SMF_SAME_FSMOOTH_OFF = 0, + SMF_NORMAL_RSMOOTH, + SMF_FLAG_MAX, +}; + +enum MhYarareType { + E_PUNCH = 0, + E_KICK, + E_STR, + E_MAWASHI, + E_MID_PUNCH, + E_MID_STR, + E_MID_MAWASHI, + E_SY_PUNCH, + E_SY_KICK, + E_SY_STR, + E_SY_MAWASHI, + E_YOKO, + E_YOKO2, + E_TACKLE, + E_KUZURE1_COUNTER, + E_KUZURE1, + E_KUZURE2_COUNTER, + E_KUZURE2, + E_URATEN, + E_UP_PUNCH, + E_DOWN_ATTACK, + E_DOWN_ATTACK2, + E_DOWN_ATTACK3, + E_JUMP_PUNCH, + E_SYAGAMASE, + E_MOUKO, + E_MOUKO2, + E_TRN_PUNCH, + E_BETA, + E_NIKIKYAKU, + E_HAZUSHI, + E_MID_SLEEPER, + E_MDLK, + E_DASH_HAMMER, + E_BETA_TATAKI, + E_KASANE, + E_LOWATK, + E_HEAVY_KICK, + E_KICK3, + E_PUNCH3, + E_SYAGAMASE2, + E_WOL_BODY, + E_KETAGURI, + E_HOZAN, + E_METUKI, + E_HEAVY, + E_UP_PUNCH_EV, + E_MDLK_EV, + E_MDLK_EV2, + E_HIZADOWN, + E_DASH_HAMMER_EV, + E_UP_PUNCH_EV2, + E_KUZURE2_HEAVY, + E_SIDE_ATTACK, + E_HEAVY_KICK_FS, + E_NIKIKYAKU_FAST, + E_NIKIKYAKU_FAST2, + E_HEAVY_BOUND, + E_JUMP_PUNCH_BOUND, + E_BETA_TATAKI_BOUND, + E_KUZURE2_UPPER, + E_HEAVY_BOUND2, + E_UP_PUNCH_URATEN, + E_UP_PUNCH_EV3, + E_UP_PUNCH2, + E_MOUKO2_KUZURE, + E_MID_STR_KUZURE, + E_MID_PUNCH_KUZURE, + E_PUNCH3_KUZURE, + E_MDLK_KUZURE, + E_MDLK_EV_KUZURE, + E_KUZURE1_KUZURE, + E_WOL_BODY_KUZURE, + E_KICK3_KUZURE, + E_GOROGORO, + E_UEFUTTOBI, + E_ITAI, + E_KUZURE2_LR, + E_HVYGD_UP_PUNCH, + E_SY_STR_BECHA, + E_MOUKO_SHORT, + E_MAKE_90DEG, + E_MOUKO_FUTTOBI, + E_MOUKO_FUTTOBI_KUZURE, + E_MOUKO_FUTTOBI2, + E_UP_PUNCH_UPPER, + E_UP_PUNCH_YORODOWN, + E_SY_MAWASHI_MAKE_90DEG, + E_LIGHT_BOUND, + E_MOUKO_KUZURE, + E_BETA_LONG, + E_HEAVY_KICK_EV, + E_HIZADOWN_AIR, + E_SYAGAMASE_BECHA, + E_MDLK_EV_KUZURE2, + E_MAWASHI_ROT_S, + E_MAWASHI_ROT_L, + E_JKD, + E_MDLK_HARD, + E_BECHA_BOUND, + E_LEG_HARD, + E_FS_TEST_1, + E_HIJI, + E_PUSH, + E_FUMARE, + E_HEAVY_FUMARE, + E_ASHIBARAI, + E_FS_TEST_7, + E_MAX, +}; + +enum MOT_BSTEP { + BSTEP_BEGIN = 0, + BSTEP_MAIN, + BSTEP_FOLLOW1, + BSTEP_FOLLOW2, + BSTEP_MAX, +}; + +enum MotAdjustType { + MA_TYPE_NONE = 0, + MA_TYPE_COMMON, + MA_TYPE_SCALE, + MA_TYPE_BODY, + MA_TYPE_ARM, + MA_TYPE_HEIGHT, + MA_TYPE_EMY_SCALE, + MA_TYPE_EMY_BODY, + MA_TYPE_EMY_ARM, + MA_TYPE_EMY_HEIGHT, + MA_TYPE_DIRECT, +}; + +enum MotLeafCtrlCharaFlag { + LC_CHARA_NONE = -1, + + LC_CHARA_OK = 0, + LC_CHARA_NG, + LC_CHARA_MAX, +}; + +enum MotLeafCtrlLimit { + LCLIMIT_XYZ = 0, + LCLIMIT_X, + LCLIMIT_Y, + LCLIMIT_Z, + LCLIMIT_XY, + LCLIMIT_XZ, + LCLIMIT_YZ, + LCLIMIT_MAX, +}; + +enum MotLeafCtrlMode { + LEAF_CTRL_NONE = -1, + + LEAF_CTRL_ON = 0, + LEAF_CTRL_OFF, + LEAF_CTRL_MAX, +}; + +enum MotLeafCtrlPart { + LCPART_TE_R = 0, + LCPART_TE_L, + LCPART_ASI_R, + LCPART_ASI_L, + LCPART_MAX, +}; + +enum MotLeafCtrlTagId { + LCTAG_ABS = 0, + LCTAG_TE_R, + LCTAG_TE_L, + LCTAG_ASI_R, + LCTAG_ASI_L, + LCTAG_SUNE_R, + LCTAG_SUNE_L, + LCTAG_UDE_R, + LCTAG_UDE_L, + LCTAG_KAO, + LCTAG_ADJ_EMY, + LCTAG_ADJ_EMY_BODY, + LCTAG_ADJ_EMY_HEIGHT, + LCTAG_ADJ_REV, + LCTAG_ADJ_BODY_REV, + LCTAG_ADJ_HEIGHT_REV, + LCTAG_OFS, + LCTAG_OFS_TE_R, + LCTAG_OFS_TE_L, + LCTAG_OFS_ASI_R, + LCTAG_OFS_ASI_L, + LCTAG_OFS_SUNE_R, + LCTAG_OFS_SUNE_L, + LCTAG_OFS_UDE_R, + LCTAG_OFS_UDE_L, + LCTAG_OFS_KAO, + LCTAG_OFS_BODY, + LCTAG_MAX, +}; + enum mot_play_frame_data_loop_state : uint32_t { MOT_PLAY_FRAME_DATA_LOOP_NONE = (uint32_t)-1, MOT_PLAY_FRAME_DATA_LOOP_ONCE = 0x00, @@ -675,105 +1351,491 @@ enum mot_play_frame_data_playback_state : uint32_t { MOT_PLAY_FRAME_DATA_PLAYBACK_MAX = 0x04, }; -enum mothead_data_type { - MOTHEAD_DATA_TYPE_0 = 0x00, - MOTHEAD_DATA_TYPE_1 = 0x01, - MOTHEAD_DATA_TYPE_2 = 0x02, - MOTHEAD_DATA_TYPE_3 = 0x03, - MOTHEAD_DATA_TYPE_4 = 0x04, - MOTHEAD_DATA_TYPE_5 = 0x05, - MOTHEAD_DATA_TYPE_6 = 0x06, - MOTHEAD_DATA_TYPE_7 = 0x07, - MOTHEAD_DATA_TYPE_8 = 0x08, - MOTHEAD_DATA_TYPE_9 = 0x09, - MOTHEAD_DATA_TYPE_10 = 0x0A, - MOTHEAD_DATA_TYPE_11 = 0x0B, - MOTHEAD_DATA_TYPE_12 = 0x0C, - MOTHEAD_DATA_TYPE_13 = 0x0D, - MOTHEAD_DATA_TYPE_14 = 0x0E, - MOTHEAD_DATA_TYPE_15 = 0x0F, - MOTHEAD_DATA_TYPE_16 = 0x10, - MOTHEAD_DATA_TYPE_17 = 0x11, - MOTHEAD_DATA_TYPE_18 = 0x12, - MOTHEAD_DATA_TYPE_19 = 0x13, - MOTHEAD_DATA_TYPE_20 = 0x14, - MOTHEAD_DATA_TYPE_21 = 0x15, - MOTHEAD_DATA_TYPE_22 = 0x16, - MOTHEAD_DATA_TYPE_23 = 0x17, - MOTHEAD_DATA_TYPE_24 = 0x18, - MOTHEAD_DATA_TYPE_25 = 0x19, - MOTHEAD_DATA_TYPE_26 = 0x1A, - MOTHEAD_DATA_TYPE_27 = 0x1B, - MOTHEAD_DATA_TYPE_28 = 0x1C, - MOTHEAD_DATA_TYPE_29 = 0x1D, - MOTHEAD_DATA_TYPE_30 = 0x1E, - MOTHEAD_DATA_TYPE_31 = 0x1F, - MOTHEAD_DATA_TYPE_32 = 0x20, - MOTHEAD_DATA_TYPE_33 = 0x21, - MOTHEAD_DATA_TYPE_34 = 0x22, - MOTHEAD_DATA_TYPE_35 = 0x23, - MOTHEAD_DATA_TYPE_36 = 0x24, - MOTHEAD_DATA_TYPE_37 = 0x25, - MOTHEAD_DATA_TYPE_38 = 0x26, - MOTHEAD_DATA_TYPE_39 = 0x27, - MOTHEAD_DATA_TYPE_40 = 0x28, - MOTHEAD_DATA_TYPE_41 = 0x29, - MOTHEAD_DATA_TYPE_42 = 0x2A, - MOTHEAD_DATA_TYPE_43 = 0x2B, - MOTHEAD_DATA_TYPE_44 = 0x2C, - MOTHEAD_DATA_TYPE_45 = 0x2D, - MOTHEAD_DATA_TYPE_46 = 0x2E, - MOTHEAD_DATA_TYPE_47 = 0x2F, - MOTHEAD_DATA_TYPE_48 = 0x30, - MOTHEAD_DATA_TYPE_49 = 0x31, - MOTHEAD_DATA_SET_FACE_MOTION_ID = 0x32, - MOTHEAD_DATA_TYPE_51 = 0x33, - MOTHEAD_DATA_TYPE_52 = 0x34, - MOTHEAD_DATA_SET_FACE_MOTTBL_MOTION = 0x35, - MOTHEAD_DATA_SET_HAND_R_MOTTBL_MOTION = 0x36, - MOTHEAD_DATA_SET_HAND_L_MOTTBL_MOTION = 0x37, - MOTHEAD_DATA_SET_MOUTH_MOTTBL_MOTION = 0x38, - MOTHEAD_DATA_SET_EYES_MOTTBL_MOTION = 0x39, - MOTHEAD_DATA_SET_EYELID_MOTTBL_MOTION = 0x3A, - MOTHEAD_DATA_SET_ROB_CHARA_HEAD_OBJECT = 0x3B, - MOTHEAD_DATA_SET_LOOK_CAMERA = 0x3C, - MOTHEAD_DATA_SET_EYELID_MOTION_FROM_FACE = 0x3D, - MOTHEAD_DATA_ROB_PARTS_ADJUST = 0x3E, - MOTHEAD_DATA_TYPE_63 = 0x3F, - MOTHEAD_DATA_OSAGE_RESET = 0x40, - MOTHEAD_DATA_MOTION_SKIN_PARAM = 0x41, - MOTHEAD_DATA_OSAGE_STEP = 0x42, - MOTHEAD_DATA_SLEEVE_ADJUST = 0x43, - MOTHEAD_DATA_TYPE_68 = 0x44, - MOTHEAD_DATA_MOTION_MAX_FRAME = 0x45, - MOTHEAD_DATA_CAMERA_MAX_FRAME = 0x46, - MOTHEAD_DATA_OSAGE_MOVE_CANCEL = 0x47, - MOTHEAD_DATA_TYPE_72 = 0x48, - MOTHEAD_DATA_ROB_HAND_ADJUST = 0x49, - MOTHEAD_DATA_DISABLE_COLLISION = 0x4A, - MOTHEAD_DATA_ROB_ADJUST_GLOBAL = 0x4B, - MOTHEAD_DATA_ROB_ARM_ADJUST = 0x4C, - MOTHEAD_DATA_DISABLE_EYE_MOTION = 0x4D, - MOTHEAD_DATA_TYPE_78 = 0x4E, - MOTHEAD_DATA_ROB_CHARA_COLI_RING = 0x4F, - MOTHEAD_DATA_ADJUST_GET_GLOBAL_POS = 0x50, - MOTHEAD_DATA_MAX = 0x51, +enum MhdNumber { + MHD_NUM_0 = 0, + MHD_NUM_1, + MHD_NUM_2, + MHD_NUM_3, + MHD_NUM_4, + MHD_NUM_5, + MHD_NUM_6, + MHD_NUM_7, + MHD_NUM_8, + MHD_NUM_9, + MHD_NUM_10, + MHD_NUM_11, + MHD_NUM_12, + MHD_NUM_13, + MHD_NUM_14, + MHD_NUM_15, + MHD_NUM_16, + MHD_NUM_17, + MHD_NUM_18, + MHD_NUM_19, + MHD_NUM_20, + MHD_NUM_21, + MHD_NUM_22, + MHD_NUM_23, + MHD_NUM_24, + MHD_NUM_25, + MHD_NUM_26, + MHD_NUM_27, + MHD_NUM_28, + MHD_NUM_29, + MHD_NUM_30, + MHD_NUM_31, + MHD_NUM_32, + MHD_NUM_33, + MHD_NUM_34, + MHD_NUM_35, + MHD_NUM_36, + MHD_NUM_37, + MHD_NUM_38, + MHD_NUM_39, + MHD_NUM_40, + MHD_SHIFT, + MHD_NUM_42, + MHD_NUM_43, + MHD_NUM_44, + MHD_NUM_45, + MHD_NUM_46, + MHD_NUM_47, + MHD_NUM_48, + MHD_NUM_49, + MHD_NUM_50, + MHD_NUM_51, + MHD_NUM_52, + MHD_NUM_53, + MHD_NUM_54, + MHD_NUM_55, + MHD_NUM_56, + MHD_NUM_57, + MHD_NUM_58, + MHD_NUM_59, + MHD_NUM_60, + MHD_NUM_61, + MHD_NUM_62, + MHD_NUM_63, + MHD_NUM_64, + MHD_NUM_65, + MHD_NUM_66, + MHD_NUM_67, + MHD_NUM_68, + MHD_MAX, +}; + +enum MhpNumber { + MHP_NUM_0 = 0, + MHP_NUM_1, + MHP_NUM_2, + MHP_NUM_3, + MHP_NUM_4, + MHP_NUM_5, + MHP_NUM_6, + MHP_NUM_7, + MHP_NUM_8, + MHP_NUM_9, + MHP_NUM_10, + MHP_NUM_11, + MHP_NUM_12, + MHP_NUM_13, + MHP_NUM_14, + MHP_NUM_15, + MHP_NUM_16, + MHP_NUM_17, + MHP_NUM_18, + MHP_NUM_19, + MHP_NUM_20, + MHP_NUM_21, + MHP_NUM_22, + MHP_NUM_23, + MHP_NUM_24, + MHP_NUM_25, + MHP_NUM_26, + MHP_NUM_27, + MHP_NUM_28, + MHP_NUM_29, + MHP_NUM_30, + MHP_NUM_31, + MHP_NUM_32, + MHP_NUM_33, + MHP_NUM_34, + MHP_NUM_35, + MHP_NUM_36, + MHP_NUM_37, + MHP_NUM_38, + MHP_NUM_39, + MHP_NUM_40, + MHP_NUM_41, + MHP_NUM_42, + MHP_NUM_43, + MHP_NUM_44, + MHP_NUM_45, + MHP_NUM_46, + MHP_NUM_47, + MHP_NUM_48, + MHP_NUM_49, + MHP_SET_FACE_MOTION_ID, + MHP_NUM_51, + MHP_NUM_52, + MHP_SET_FACE_MOTTBL_MOTION, + MHP_SET_HAND_R_MOTTBL_MOTION, + MHP_SET_HAND_L_MOTTBL_MOTION, + MHP_SET_MOUTH_MOTTBL_MOTION, + MHP_SET_EYES_MOTTBL_MOTION, + MHP_SET_EYELID_MOTTBL_MOTION, + MHP_SET_ROB_CHARA_HEAD_OBJECT, + MHP_SET_LOOK_CAMERA, + MHP_SET_EYELID_MOTION_FROM_FACE, + MHP_ROB_PARTS_ADJUST, + MHP_NUM_63, + MHP_OSAGE_RESET, + MHP_MOTION_SKIN_PARAM, + MHP_OSAGE_STEP, + MHP_SLEEVE_ADJUST, + MHP_NUM_68, + MHP_MOTION_MAX_FRAME, + MHP_CAMERA_MAX_FRAME, + MHP_OSAGE_MOVE_CANCEL, + MHP_NUM_72, + MHP_ROB_HAND_ADJUST, + MHP_DISABLE_COLLISION, + MHP_ROB_ADJUST_GLOBAL, + MHP_ROB_ARM_ADJUST, + MHP_DISABLE_EYE_MOTION, + MHP_NUM_78, + MHP_ROB_CHARA_COLI_RING, + MHP_ADJUST_GET_GLOBAL_POS, + MHP_MAX, }; enum MotionBlendType { - MOTION_BLEND_NONE = -1, + MOTION_BLEND_NONE = -1, + MOTION_BLEND = 0x00, MOTION_BLEND_FREEZE = 0x01, MOTION_BLEND_CROSS = 0x02, MOTION_BLEND_COMBINE = 0x03, }; -enum rob_chara_type { - ROB_CHARA_TYPE_NONE = -1, - ROB_CHARA_TYPE_0 = 0x00, - ROB_CHARA_TYPE_1 = 0x01, - ROB_CHARA_TYPE_2 = 0x02, - ROB_CHARA_TYPE_3 = 0x03, +// Pure assumption +enum MOTTABLE_TYPE { + MTP_NONE = 0, + MTP_1, + MTP_2, + MTP_3, + MTP_4, + MTP_5, + MTP_FACE_NULL, + MTP_FACE_RESET, + MTP_FACE_RESET_CL, + MTP_FACE_RESET_OLD, + MTP_FACE_RESET_OLD_CL, + MTP_FACE_SAD, + MTP_FACE_SAD_CL, + MTP_FACE_SAD_OLD, + MTP_FACE_SAD_OLD_CL, + MTP_FACE_LAUGH, + MTP_FACE_LAUGH_CL, + MTP_FACE_LAUGH_OLD, + MTP_FACE_LAUGH_OLD_CL, + MTP_FACE_SURPRISE, + MTP_FACE_SURPRISE_CL, + MTP_FACE_SURPRISE_OLD, + MTP_FACE_SURPRISE_OLD_CL, + MTP_FACE_WINK_OLD, + MTP_FACE_WINK_OLD_CL, + MTP_FACE_ADMIRATION, + MTP_FACE_ADMIRATION_CL, + MTP_FACE_ADMIRATION_OLD, + MTP_FACE_ADMIRATION_OLD_CL, + MTP_FACE_SMILE, + MTP_FACE_SMILE_CL, + MTP_FACE_SMILE_OLD, + MTP_FACE_SMILE_OLD_CL, + MTP_FACE_SETTLED, + MTP_FACE_SETTLED_CL, + MTP_FACE_SETTLED_OLD, + MTP_FACE_SETTLED_OLD_CL, + MTP_FACE_DAZZLING, + MTP_FACE_DAZZLING_CL, + MTP_FACE_DAZZLING_OLD, + MTP_FACE_DAZZLING_OLD_CL, + MTP_FACE_LASCIVIOUS, + MTP_FACE_LASCIVIOUS_CL, + MTP_FACE_LASCIVIOUS_OLD, + MTP_FACE_LASCIVIOUS_OLD_CL, + MTP_FACE_STRONG, + MTP_FACE_STRONG_CL, + MTP_FACE_STRONG_OLD, + MTP_FACE_STRONG_OLD_CL, + MTP_FACE_CLARIFYING, + MTP_FACE_CLARIFYING_CL, + MTP_FACE_CLARIFYING_OLD, + MTP_FACE_CLARIFYING_OLD_CL, + MTP_FACE_GENTLE, + MTP_FACE_GENTLE_CL, + MTP_FACE_GENTLE_OLD, + MTP_FACE_GENTLE_OLD_CL, + MTP_FACE_CRY, + MTP_FACE_CRY_CL, + MTP_FACE_CRY_OLD, + MTP_FACE_CRY_OLD_CL, + MTP_FACE_CLOSE, + MTP_FACE_CLOSE_CL, + MTP_FACE_CLOSE_OLD, + MTP_FACE_CLOSE_OLD_CL, + MTP_FACE_NAGASI, + MTP_FACE_NAGASI_CL, + MTP_FACE_NAGASI_OLD, + MTP_FACE_NAGASI_OLD_CL, + MTP_FACE_KIRI, + MTP_FACE_KIRI_CL, + MTP_FACE_KIRI_OLD, + MTP_FACE_KIRI_OLD_CL, + MTP_FACE_UTURO, + MTP_FACE_UTURO_CL, + MTP_FACE_UTURO_OLD, + MTP_FACE_UTURO_OLD_CL, + MTP_FACE_OMOU, + MTP_FACE_OMOU_CL, + MTP_FACE_OMOU_OLD, + MTP_FACE_OMOU_OLD_CL, + MTP_FACE_SETUNA, + MTP_FACE_SETUNA_CL, + MTP_FACE_SETUNA_OLD, + MTP_FACE_SETUNA_OLD_CL, + MTP_FACE_GENKI, + MTP_FACE_GENKI_CL, + MTP_FACE_GENKI_OLD, + MTP_FACE_GENKI_OLD_CL, + MTP_FACE_YARU, + MTP_FACE_YARU_CL, + MTP_FACE_YARU_OLD, + MTP_FACE_YARU_OLD_CL, + MTP_FACE_COOL, + MTP_FACE_COOL_CL, + MTP_FACE_KOMARIWARAI, + MTP_FACE_KOMARIWARAI_CL, + MTP_FACE_KUMON, + MTP_FACE_KUMON_CL, + MTP_FACE_KUTSUU, + MTP_FACE_KUTSUU_CL, + MTP_FACE_NAKI, + MTP_FACE_NAKI_CL, + MTP_FACE_NAYAMI, + MTP_FACE_NAYAMI_CL, + MTP_FACE_SUPSERIOUS, + MTP_FACE_SUPSERIOUS_CL, + MTP_FACE_TSUYOKIWARAI, + MTP_FACE_TSUYOKIWARAI_CL, + MTP_FACE_WINK_L, + MTP_FACE_WINK_L_CL, + MTP_FACE_WINK_R, + MTP_FACE_WINK_R_CL, + MTP_FACE_WINKG_L, + MTP_FACE_WINKG_L_CL, + MTP_FACE_WINKG_R, + MTP_FACE_WINKG_R_CL, + MTP_FACE_RESET1, + MTP_FACE_RESET1_CL, + MTP_FACE_RESET2, + MTP_FACE_RESET2_CL, + MTP_FACE_RESET3, + MTP_FACE_RESET3_CL, + MTP_FACE_RESET4, + MTP_FACE_RESET4_CL, + MTP_FACE_RESET5, + MTP_FACE_RESET5_CL, + MTP_FACE_WINK_FT_OLD, + MTP_FACE_WINK_FT_OLD_CL, + MTP_FACE_NEW_IKARI_OLD, + MTP_FACE_NEW_IKARI_OLD_CL, + MTP_KUCHI_NULL, + MTP_KUCHI_RESET, + MTP_KUCHI_RESET_OLD, + MTP_KUCHI_A, + MTP_KUCHI_A_OLD, + MTP_KUCHI_I, + MTP_KUCHI_I_OLD, + MTP_KUCHI_U, + MTP_KUCHI_U_OLD, + MTP_KUCHI_E, + MTP_KUCHI_E_OLD, + MTP_KUCHI_O, + MTP_KUCHI_O_OLD, + MTP_KUCHI_HE, + MTP_KUCHI_HE_OLD, + MTP_KUCHI_SURPRISE, + MTP_KUCHI_SURPRISE_OLD, + MTP_KUCHI_SMILE, + MTP_KUCHI_SMILE_OLD, + MTP_KUCHI_NIYA, + MTP_KUCHI_NIYA_OLD, + MTP_KUCHI_CHU, + MTP_KUCHI_CHU_OLD, + MTP_KUCHI_E_DOWN, + MTP_KUCHI_HAMISE, + MTP_KUCHI_HAMISE_DOWN, + MTP_KUCHI_HE_S, + MTP_KUCHI_HERAHERA, + MTP_KUCHI_MOGUMOGU, + MTP_KUCHI_NEKO, + MTP_KUCHI_SAKEBI, + MTP_KUCHI_SAKEBI_L, + MTP_KUCHI_SMILE_L, + MTP_KUCHI_NEUTRAL, + MTP_EYES_NULL, + MTP_EYES_RESET, + MTP_EYES_RESET_OLD, + MTP_EYES_UP, + MTP_EYES_UP_OLD, + MTP_EYES_DOWN, + MTP_EYES_DOWN_OLD, + MTP_EYES_LEFT, + MTP_EYES_LEFT_OLD, + MTP_EYES_RIGHT, + MTP_EYES_RIGHT_OLD, + MTP_EYES_UP_LEFT, + MTP_EYES_UP_LEFT_OLD, + MTP_EYES_UP_RIGHT, + MTP_EYES_UP_RIGHT_OLD, + MTP_EYES_DOWN_LEFT, + MTP_EYES_DOWN_LEFT_OLD, + MTP_EYES_DOWN_RIGHT, + MTP_EYES_DOWN_RIGHT_OLD, + MTP_EYES_MOVE_U_D, + MTP_EYES_MOVE_U_D_OLD, + MTP_EYES_MOVE_L_R, + MTP_EYES_MOVE_L_R_OLD, + MTP_EYES_MOVE_UL_DR, + MTP_EYES_MOVE_UL_DR_OLD, + MTP_EYES_MOVE_UR_DL, + MTP_EYES_MOVE_UR_DL_OLD, + MTP_HAND_NULL, + MTP_HAND_RESET, + MTP_HAND_NORMAL, + MTP_HAND_OPEN, + MTP_HAND_CLOSE, + MTP_HAND_PEACE, + MTP_HAND_GOOD, + MTP_HAND_ONE, + MTP_HAND_THREE, + MTP_HAND_NEGI, + MTP_HAND_SIZEN, + MTP_HAND_PICK, + MTP_HAND_MIC, + MTP_HAND_FAN, + MTP_HAND_BOTTLE, + MTP_HAND_PHONE, + MTP_HAND_HOLD, + MTP_HAND_FLASHLIGHT, + MTP_HAND_MIC_BLK, + MTP_HAND_MIC_SLV, + MTP_HAND_CUPICE, + MTP_HAND_ICEBAR, + MTP_FACE_MOT_SLOT_1, + MTP_FACE_MOT_SLOT_2, + MTP_FACE_MOT_SLOT_3, + MTP_FACE_MOT_SLOT_4, + MTP_FACE_MOT_SLOT_5, + MTP_FACE_MOT_SLOT_6, + MTP_FACE_MOT_SLOT_7, + MTP_FACE_MOT_SLOT_8, + MTP_FACE_MOT_SLOT_9, + MTP_FACE_MOT_SLOT_10, + MTP_EYES_BASE_MOT, + MTP_225, + MTP_226, + MTP_227, + MTP_228, + MTP_229, + MTP_230, + MTP_231, + MTP_232, + MTP_233, + MTP_234, + MTP_235, + MTP_FACE_EYEBROW_UP_RIGHT, + MTP_FACE_EYEBROW_UP_RIGHT_CL, + MTP_FACE_EYEBROW_UP_LEFT, + MTP_FACE_EYEBROW_UP_LEFT_CL, + MTP_FACE_KOMARIEGAO, + MTP_FACE_KOMARIEGAO_CL, + MTP_FACE_KONWAKU, + MTP_FACE_KONWAKU_CL, + MTP_KUCHI_PSP_A, + MTP_KUCHI_PSP_E, + MTP_KUCHI_PSP_O, + MTP_KUCHI_PSP_SURPRISE, + MTP_KUCHI_PSP_NIYA, + MTP_KUCHI_PSP_NIYARI, + MTP_KUCHI_HAMISE_E, + MTP_KUCHI_SANKAKU, + MTP_KUCHI_SHIKAKU, + MTP_MAX, +}; + +enum ReviseType { + REVISE_NORMAL = 0x0, + REVISE_FAST, + REVISE_SLOW, + REVISE_GUARD, + REVISE_RISE, + REVISE_YARARE, + REVISE_STRISE, + REVISE_SLOW2, + REVISE_ATTACK_FOLLOW, + REVISE_SLOW_GUARD, + REVISE_GUARD2, + REVISE_RISE_SLOW, + REVISE_TYPE_MAX, +}; + +// Pure assumption +enum ROB_COLLI_ID { + ROB_COLLI_ID_DUMMY = -1, + + ROB_COLLI_ID_KOSHI = 0, + ROB_COLLI_ID_MUNE_L, + ROB_COLLI_ID_MUNE_R, + ROB_COLLI_ID_KUBI, + ROB_COLLI_ID_KAO, + ROB_COLLI_ID_KATA_R1, + ROB_COLLI_ID_KATA_R2, + ROB_COLLI_ID_UDE_R1, + ROB_COLLI_ID_UDE_R2, + ROB_COLLI_ID_TE_R, + ROB_COLLI_ID_KATA_L1, + ROB_COLLI_ID_KATA_L2, + ROB_COLLI_ID_UDE_L1, + ROB_COLLI_ID_UDE_L2, + ROB_COLLI_ID_TE_L, + ROB_COLLI_ID_MOMO_R1, + ROB_COLLI_ID_MOMO_R2, + ROB_COLLI_ID_SUNE_R1, + ROB_COLLI_ID_SUNE_R2, + ROB_COLLI_ID_ASI_R, + ROB_COLLI_ID_TOE_R, + ROB_COLLI_ID_MOMO_L1, + ROB_COLLI_ID_MOMO_L2, + ROB_COLLI_ID_SUNE_L1, + ROB_COLLI_ID_SUNE_L2, + ROB_COLLI_ID_ASI_L, + ROB_COLLI_ID_TOE_L, + ROB_COLLI_ID_MAX, +}; + +enum ROB_ID { + ROB_ID_1P = 0, + ROB_ID_2P, + ROB_ID_3P, + ROB_ID_4P, + ROB_ID_5P, + ROB_ID_6P, + ROB_ID_MAX, + + ROB_ID_NULL = -1, }; enum rob_chara_data_hand_adjust_type : uint16_t { @@ -797,7 +1859,8 @@ enum rob_chara_data_hand_adjust_type : uint16_t { }; enum rob_osage_parts { - ROB_OSAGE_PARTS_NONE = -1, + ROB_OSAGE_PARTS_NONE = -1, + ROB_OSAGE_PARTS_LEFT = 0x00, ROB_OSAGE_PARTS_RIGHT = 0x01, ROB_OSAGE_PARTS_CENTER = 0x02, @@ -849,6 +1912,23 @@ enum rob_partial_motion_playback_state : uint32_t { ROB_PARTIAL_MOTION_PLAYBACK_MAX = 0x05, }; +enum RobType { + ROB_TYPE_NULL = -1, + + ROB_TYPE_PLAYER = 0x00, + ROB_TYPE_CPU_ENEMY = 0x01, + ROB_TYPE_AUTH = 0x02, + ROB_TYPE_DATA_TEST = 0x03, + ROB_TYPE_MAX = 0x04, +}; + +enum TargetType { + ROB_TARGET_NONE = 0, + ROB_TARGET_WALL, + ROB_TARGET_ENEMY, + ROB_TARGET_RINGOUT, +}; + enum ExNodeType { EX_NODE_TYPE_NULL = 0x00, EX_NODE_TYPE_OSAGE = 0x01, @@ -897,8 +1977,8 @@ namespace SkinParam { }; } -struct rob_chara; -struct rob_chara_bone_data; +class rob_chara; +class rob_chara_bone_data; struct RobTransform { vec3 pos; @@ -910,10 +1990,10 @@ struct RobTransform { void CalcMatrixHS(const vec3& hsc, mat4& mat, mat4& dsp_mat); + void init(); + void init(const vec3& p, const vec3& r); void init(float_t px, float_t py, float_t pz, float_t rx, float_t ry, float_t rz); - void init(const vec3& p, const vec3& r); - void reset(); void reset_scale(); }; @@ -928,7 +2008,7 @@ struct RobNode { float_t* get_transform_component(size_t index, Expr_type& type); const float_t* get_transform_component(size_t index, Expr_type& type) const; - void set_name_mat_no_scale_mat(const char* name, mat4* mat, mat4* no_scale_mat); + void init(const char* in_name, mat4* in_mat, mat4* in_no_scale_mat); }; struct struc_314 { @@ -936,29 +2016,26 @@ struct struc_314 { size_t field_8; }; -struct mot_key_set { - mot_key_set_type type; - int32_t keys_count; - int32_t current_key; - int32_t last_key; - const uint16_t* frames; - const float_t* values; +struct FcurveKey { + FcurveKeyKind kind; + int32_t sum; + int32_t cache_idx; + int32_t last_idx; + const uint16_t* num; + const float_t* val; }; -struct eyes_adjust { - bool xrot_adjust; - eyes_base_adjust_type base_adjust; - float_t neg; - float_t pos; +struct Fcurve { + uint16_t fc_max; + uint16_t frame_max; + uint16_t key_num_type; + FcurveKey* fck_ptr; - eyes_adjust(); -}; - -struct mot { - uint16_t key_set_count; - uint16_t frame_count; - uint16_t field_4; - mot_key_set* key_sets; + bool fcurve_init(const void* data); + void fcurve_init_u16(const void* data); + void interpolate(float_t frame, float_t* value, + FcurveKey* fck, uint32_t in_fc_max, const struct struc_369* a6); + void set_fck_ptr(FcurveKey* ptr); }; struct struc_369 { @@ -969,13 +2046,13 @@ struct struc_369 { struct mot_key_data { bool key_sets_ready; size_t key_set_count; - prj::sys_vector key_set; - mot mot; + prj::sys_vector key_set; + Fcurve mot; prj::sys_vector fc_value; const mot_data* mot_data; - BONE_KIND skeleton_type; - int32_t skeleton_select; - uint32_t motion_id; + BONE_KIND kind; + int32_t motion_body_type; + uint32_t motnum; float_t frame; struc_369 field_68; @@ -1013,47 +2090,47 @@ struct RobBlock { RobBlock(); ~RobBlock(); + bool calc_constraint(const RobBlock* block_top); void copy_rot_trans(const RobBlock& other); bool check_expression_id_not_null(); - bool get_constraint_ik(const RobBlock* bones); - bool get_ex_rotation(RobTransform& transform, const RobBlock* bones); - void get_mat(int32_t skeleton_select); - void get_mat_ik(int32_t skeleton_select); - void mult_mat(const mat4& parent_mat, const RobBlock* bones, bool solve_ik); - void orient_x(const vec3& target); - void orient_x_cns(const vec3& target, float_t weight); - void orient_y(vec3 y_axis); + void exp_set_dir(const vec3& glo); + void exp_set_dir_zx(vec3 vy); + void exp_set_rot(const vec3& glo, float_t keisuu); + bool get_ex_rotation(RobTransform& transform, const RobBlock* block_top); + void get_mat(int32_t target); + void solve_ik(int32_t target); + void recalc_fk_block(const mat4& cur_mat, const RobBlock* block_top, bool rot); const vec3* set_global_leaf_sub(const vec3* val, BONE_KIND kind, bool get_data, bool flip_x); - void store_curr_rot_trans(int32_t skeleton_select); + void get_smooth_target(int32_t target); static float_t limit_angle(float_t angle); - static void orient_to_target(mat4& mat, vec3 target, vec3 source); }; struct bone_data_parent { rob_chara_bone_data* rob_bone_data; - size_t motion_bone_count; - size_t leaf_pos; - size_t chain_pos; - prj::sys_vector bones; + size_t block_max; + size_t leaf_pos_max; + size_t chain_pos_max; + prj::sys_vector block_vec; prj::sys_vector bone_indices; vec3 gblctr_pos; vec3 gblctr_rot; uint32_t bone_key_set_count; uint32_t global_key_set_count; - float_t rot_y; + float_t yrot; bone_data_parent(); ~bone_data_parent(); - void ik_init(const BODYTYPE* bt, const CHAINPOSRADIUS* motion_chain_pos, const CHAINPOSRADIUS* disp_chain_pos); + void ik_init(const std::vector* body_type_table, + const CHAINPOSRADIUS* joint_table, const CHAINPOSRADIUS* disp_joint_table); }; struct mot_play_frame_data { float_t frame; float_t step; float_t step_prev; - float_t frame_count; + float_t frame_max; float_t last_frame; float_t max_frame; mot_play_frame_data_playback_state playback_state; @@ -1078,25 +2155,27 @@ struct mot_play_data { void reset(); }; -struct struc_308 { +struct MotionSmooth { int32_t field_0; int32_t field_4; uint8_t field_8; - mat4 mat; - mat4 field_4C; - bool field_8C; + mat4 base_mtx; + mat4 base_mtx_bef; + bool base_mtx_set; vec3 field_90; vec3 field_9C; vec3 field_A8; - float_t rot_y; - float_t prev_rot_y; - uint8_t field_BC; - uint8_t field_BD; + float_t move_yang; + float_t move_yang_bef; + bool root_ypos; + bool root_xzpos; float_t field_C0; float_t field_C4; vec3 field_C8; - struc_308(); + MotionSmooth(); + + void reset(); }; struct struc_400 { @@ -1106,8 +2185,8 @@ struct struc_400 { bool field_3; bool field_4; float_t frame; - float_t rot_y; - float_t prev_rot_y; + float_t move_yang; + float_t move_yang_bef; }; class MotionBlend { @@ -1197,7 +2276,7 @@ public: virtual void Blend(RobBlock* curr, RobBlock* prev) override; }; -typedef bool(* PFNMOTIONBONECHECKFUNC)(BONE_BLK bone_index); +typedef bool(* PFNMOTIONBONECHECKFUNC)(BONE_BLK blk); struct motion_blend_mot_enabled_bones { PFNMOTIONBONECHECKFUNC func; @@ -1221,7 +2300,7 @@ struct motion_blend_mot { bone_data_parent bone_data; mot_key_data mot_key_data; mot_play_data mot_play_data; - struc_308 field_4F8; + MotionSmooth smooth; int32_t field_5CC; MotionBlend* blend; @@ -1230,33 +2309,33 @@ struct motion_blend_mot { void apply_global_transform(); void copy_rot_trans(); - void copy_rot_trans(const prj::sys_vector& bones); + void copy_rot_trans(const prj::sys_vector& block_vec); bool get_blend_enable(); void get_n_hara_cp_position(vec3& value); MotionBlendType get_type(); void init(rob_chara_bone_data* rob_bone_data, PFNMOTIONBONECHECKFUNC check_func, const bone_database* bone_data); void interpolate(); - void load_file(uint32_t motion_id, MotionBlendType blend_type, float_t blend, + void load_file(uint32_t motnum, MotionBlendType blend_type, float_t blend, const bone_database* bone_data, const motion_database* mot_db); void mult_mat(const mat4* mat); void reset(); - void set_arm_length(BONE_BLK block_id, float_t value); + void set_arm_length(BONE_BLK blk, float_t value); void set_blend(MotionBlendType blend_type, float_t blend); void set_blend_duration(float_t duration, float_t step, float_t offset); void set_step(float_t step); - void store_curr_rot_trans(int32_t skeleton_select); + void get_smooth_target(int32_t motion_body_type); - static bool interpolate_get_flip(struc_308& a1); + static bool interpolate_get_flip(MotionSmooth& a1); }; -struct rob_chara_bone_data_ik_scale { - float_t ratio0; - float_t ratio1; - float_t ratio2; - float_t ratio3; +struct rob_chara_bone_data_adjust_scale { + float_t base; + float_t body; + float_t arm; + float_t height; - rob_chara_bone_data_ik_scale(); + rob_chara_bone_data_adjust_scale(); }; struct partial_motion_blend_mot { @@ -1269,16 +2348,16 @@ struct partial_motion_blend_mot { partial_motion_blend_mot(); ~partial_motion_blend_mot(); - void init(BONE_KIND type, - PFNMOTIONBONECHECKFUNC bone_check_func, size_t motion_bone_count, const bone_database* bone_data); - void interpolate(prj::sys_vector& bones, - const prj::sys_vector* bone_indices, BONE_KIND skeleton_type); - void load_motion(uint32_t motion_id, const motion_database* mot_db); + void init(BONE_KIND type, PFNMOTIONBONECHECKFUNC bone_check_func, + size_t block_max, const bone_database* bone_data); + void interpolate(prj::sys_vector& block_vec, + const prj::sys_vector* bone_indices, BONE_KIND kind); + void load_file(uint32_t motnum, const motion_database* mot_db); void reset(); void set_blend_duration(float_t duration, float_t step, float_t offset); void set_frame(float_t frame); void set_step(float_t step); - void store_curr_rot_trans(prj::sys_vector& bones); + void get_smooth_target(prj::sys_vector& block_vec); }; struct rob_chara_look_anim_eye_param_limits { @@ -1329,17 +2408,33 @@ struct struc_823 { float_t field_C; }; -struct struc_936 { - vec3 toe_l; - vec3 toe_r; +struct Motion { + struct AshiOidashi { + float_t y_bef; + float_t y_old; + float_t scale; - struc_936(); + AshiOidashi(); - void reset(); + void reset(); + }; + + struct AshiOidashiColle { + AshiOidashi l; + AshiOidashi r; + + AshiOidashiColle(); + + void calc(prj::sys_vector& block_vec, const mat4& cur_mat, float_t step, + BONE_KIND kind, const BONE_BLK* c_momo_l_ik_blk, const BONE_BLK* c_momo_r_ik_blk); + void calc_sub(RobBlock& bl_momo, const RobBlock& bl_toe, + float_t hh, Motion::AshiOidashi& ashi, float_t step); + void reset(); + }; }; struct rob_chara_look_anim { - prj::sys_vector* bones; + prj::sys_vector* block_vec; mat4 mat; rob_chara_look_anim_eye_param param; bool update_view_point; @@ -1413,7 +2508,7 @@ struct rob_chara_sleeve_adjust { vec3 field_74; vec3 field_80; float_t radius; - prj::sys_vector* bones; + prj::sys_vector* block_vec; float_t step; rob_chara_sleeve_adjust(); @@ -1421,19 +2516,20 @@ struct rob_chara_sleeve_adjust { void reset(); }; -struct rob_chara_bone_data { +class rob_chara_bone_data { +public: bool field_0; bool field_1; - size_t object_bone_count; - size_t node_count; - size_t motion_bone_count; - size_t leaf_pos; - size_t chain_pos; - std::vector mats; - std::vector mats2; - std::vector nodes; - BONE_KIND base_skeleton_type; - BONE_KIND skeleton_type; + size_t mat_max; + size_t node_max; + size_t block_max; + size_t leaf_pos_max; + size_t chain_pos_max; + std::vector mat_vec; + std::vector mat2_vec; + std::vector node_vec; + BONE_KIND kind; + BONE_KIND disp_kind; std::vector motions; std::list motion_indices; std::list motion_loaded_indices; @@ -1445,8 +2541,8 @@ struct rob_chara_bone_data { partial_motion_blend_mot eyes; partial_motion_blend_mot eyelid; bool disable_eye_motion; - rob_chara_bone_data_ik_scale ik_scale; - struc_936 field_76C; + rob_chara_bone_data_adjust_scale adjust_scale; + Motion::AshiOidashiColle ashi_oidashi; rob_chara_look_anim look_anim; rob_chara_sleeve_adjust sleeve_adjust; @@ -1455,8 +2551,8 @@ struct rob_chara_bone_data { bool check_look_anim_head_rotation(); bool check_look_anim_ext_head_rotation(); - float_t get_frame(); - float_t get_frame_count(); + float_t get_frame() const; + float_t get_frame_max() const; vec3* get_look_anim_target_view_point(); bool get_look_anim_ext_head_rotation(); bool get_look_anim_head_rotation(); @@ -1464,12 +2560,12 @@ struct rob_chara_bone_data { mat4* get_mats_mat(size_t index); bool get_motion_has_looped(); void interpolate(); - void load_eyes_motion(uint32_t motion_id, const motion_database* mot_db); - void load_face_motion(uint32_t motion_id, const motion_database* mot_db); - void load_eyelid_motion(uint32_t motion_id, const motion_database* mot_db); - void load_hand_l_motion(uint32_t motion_id, const motion_database* mot_db); - void load_hand_r_motion(uint32_t motion_id, const motion_database* mot_db); - void load_mouth_motion(uint32_t motion_id, const motion_database* mot_db); + void load_eyes_motion(uint32_t motnum, const motion_database* mot_db); + void load_face_motion(uint32_t motnum, const motion_database* mot_db); + void load_eyelid_motion(uint32_t motnum, const motion_database* mot_db); + void load_hand_l_motion(uint32_t motnum, const motion_database* mot_db); + void load_hand_r_motion(uint32_t motnum, const motion_database* mot_db); + void load_mouth_motion(uint32_t motnum, const motion_database* mot_db); void motion_step(); void reset(); void set_disable_eye_motion(bool value); @@ -1494,7 +2590,7 @@ struct rob_chara_bone_data { void set_look_anim_target_view_point(const vec3& value); void set_mats_identity(); void set_motion_blend_duration(float_t duration, float_t step, float_t offset); - void set_motion_frame(float_t frame, float_t step, float_t frame_count); + void set_motion_frame(float_t frame, float_t step, float_t frame_max); void set_motion_loop(float_t loop_begin, int32_t loop_count, float_t loop_end); void set_motion_loop_state(mot_play_frame_data_loop_state value); void set_motion_max_frame(float_t value); @@ -1505,17 +2601,8 @@ struct rob_chara_bone_data { void update(const mat4* mat); }; -union rob_chara_pv_data_item { - struct { - int32_t head; - int32_t face; - int32_t chest; - int32_t back; - }; - int32_t arr[4]; -}; - -struct RobAngle { +class RobAngle { +public: int16_t value; inline RobAngle( ) : value() {} @@ -1550,6 +2637,14 @@ inline RobAngle operator+(const RobAngle& left, const int32_t& right) { return (int16_t)(left.value + right); } +inline void operator+=(RobAngle& left, const RobAngle& right) { + left = (int16_t)(left.value + right.value); +} + +inline void operator+=(RobAngle& left, const int32_t right) { + left = (int16_t)(left.value + right); +} + inline RobAngle operator-(const RobAngle& left, const RobAngle& right) { return (int16_t)(left.value - right.value); } @@ -1562,26 +2657,51 @@ inline RobAngle operator-(const RobAngle& left, const int32_t& right) { return (int16_t)(left.value - right); } -struct rob_chara_pv_data { - rob_chara_type type; - bool field_4; - bool field_5; - bool field_6; - vec3 field_8; +inline void operator-=(RobAngle& left, const RobAngle& right) { + left = (int16_t)(left.value - right.value); +} + +inline void operator-=(RobAngle& left, const int32_t right) { + left = (int16_t)(left.value - right); +} + +inline RobAngle operator-(const RobAngle& left) { + return -left.value; +} + +struct eyes_adjust { + bool xrot_adjust; + eyes_base_adjust_type base_adjust; + float_t neg; + float_t pos; + + eyes_adjust(); +}; + +struct RobItemEquipInit { + uint32_t item_no[4]; +}; + +struct RobInit { + RobType rob_type; + bool disp; + bool mirror; + bool drank_reset; + vec3 pos; RobAngle yang; - int16_t field_16; + int16_t energy; rob_sleeve_data sleeve_l; rob_sleeve_data sleeve_r; int32_t field_70; - uint32_t motion_face_ids[10]; + uint32_t face_mot_slot[10]; int32_t chara_size_index; bool height_adjust; - rob_chara_pv_data_item item; + RobItemEquipInit item; eyes_adjust eyes_adjust; - rob_chara_pv_data(); + RobInit(); - void reset(); + void init(); }; struct RobCollisionData { @@ -1591,13 +2711,6 @@ struct RobCollisionData { int32_t field_14; }; -struct struc_344 { - int32_t chara_size_index; - int32_t field_4; - int32_t swim_costume; - int32_t swim_s_costume; -}; - struct RobKamae { const char* name; int32_t field_8; @@ -1607,9 +2720,16 @@ struct RobKamae { int32_t field_18; }; +struct struc_344 { + int32_t chara_size_index; + int32_t field_4; + int32_t swim_costume; + int32_t swim_s_costume; +}; + struct RobData { - int32_t object_set; - BONE_KIND skeleton_type; + int32_t objset; + BONE_KIND bone; object_info body_obj_uid[15]; uint32_t motfile; uint32_t motfile_auth; @@ -1623,7 +2743,7 @@ struct RobData { object_info face_objects[15]; }; -struct rob_chara_item_equip_object; +class RobSkinDisp; struct RobSkinOfs { bool flag; @@ -1640,7 +2760,7 @@ public: const RobNode* parent; std::string parent_name; ExNodeBlock* parent_node; - const rob_chara_item_equip_object* skin_disp; + const RobSkinDisp* skin_disp; bool is_parent; bool done; bool has_children_node; @@ -1662,7 +2782,8 @@ public: void init_members(); void set_data(RobNode* node, ExNodeType type, - const char* name, const rob_chara_item_equip_object* skin_disp); + const char* name, const RobSkinDisp* skin_disp); + void set_name(const char* name); }; class ExNullBlock : public ExNodeBlock { @@ -1682,7 +2803,7 @@ public: virtual void pos_init() override; virtual void pos_init_cont() override; - void set_data(const rob_chara_item_equip_object* skin_disp, const obj_skin_ex_node_constraint* data, + void set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_constraint* data, const char* name, const bone_database* bone_data); }; @@ -1760,9 +2881,9 @@ struct RobJointNodeData { }; struct opd_blend_data { - uint32_t motion_id; + uint32_t motnum; float_t frame; - float_t frame_count; + float_t frame_max; bool use_blend; #if OPD_PLAY_GEN bool no_loop; // Added @@ -2115,7 +3236,7 @@ struct CLOTH_WEIGHTED_ROOT { struct RobCloth : public CLOTH { const mat4* local_mat; std::vector root; - const rob_chara_item_equip_object* skin_disp; + const RobSkinDisp* skin_disp; const obj_skin_ex_node_cloth_root* root_data; const obj_skin_ex_node_cloth* data; float_t move_cancel; @@ -2133,12 +3254,12 @@ struct RobCloth : public CLOTH { virtual void disp_debug() override; virtual void dest() override; - void AddMotionResetData(uint32_t motion_id, float_t frame); + void AddMotionResetData(uint32_t motnum, float_t frame); void ApplyResetData(); void CtrlOsagePlayData(const std::vector& opd_blend_data); const float_t* LoadOpdData(size_t node_index, const float_t* opd_data, size_t opd_count); void LoadSkinParam(void* kv, const char* name, const bone_database* bone_data); - void SetMotionResetData(uint32_t motion_id, float_t frame); + void SetMotionResetData(uint32_t motnum, float_t frame); const float_t* SetOsagePlayDataInit(const float_t* opdi_data); void SetOsageReset(); void SetRing(const osage_ring_data& ring); @@ -2160,9 +3281,9 @@ struct RobCloth : public CLOTH { void reset_ex_force(); void set_data(size_t w, size_t h, const obj_skin_ex_node_cloth_root* rt_data, const obj_skin_ex_node_cloth_point* move, const mat4* lcl_mat, uint32_t ring_flag, - const rob_chara_item_equip_object* skin, const bone_database* bone_data); + const RobSkinDisp* skin, const bone_database* bone_data); void set_data(const obj_skin_ex_node_cloth* cldata, - const rob_chara_item_equip_object* skin, const bone_database* bone_data); + const RobSkinDisp* skin, const bone_database* bone_data); void set_ex_force(const vec3& f); void set_move_cancel(const float_t& mv_ccl); void set_param(float_t force, float_t force_gain, float_t air_res); @@ -2189,9 +3310,9 @@ public: virtual void pos_init() override; virtual void pos_init_cont() override; - void AddMotionResetData(uint32_t motion_id, float_t frame); + void AddMotionResetData(const uint32_t& motnum, const float_t& frame); const float_t* LoadOpdData(size_t node_index, const float_t* opd_data, size_t opd_count); - void SetMotionResetData(uint32_t motion_id, float_t frame); + void SetMotionResetData(const uint32_t& motnum, const float_t& frame); const float_t* SetOsagePlayDataInit(const float_t* opdi_data); void SetOsageReset(); void SetRing(const osage_ring_data& ring); @@ -2199,7 +3320,7 @@ public: void SetSkinParamOsageRoot(const skin_param_osage_root* skp_root); void reset_ex_force(); - void set_data(const rob_chara_item_equip_object* skin_disp, const obj_skin_ex_node_cloth* cls_data, + void set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_cloth* cls_data, const skin_param_osage_root* skp_root, const bone_database* bone_data); void set_ex_force(const vec3& f); void set_move_cancel(const float_t& mv_ccl); @@ -2253,7 +3374,7 @@ struct RobOsage { RobOsage(); ~RobOsage(); - void AddMotionResetData(uint32_t motion_id, float_t frame); + void AddMotionResetData(const uint32_t& motnum, const float_t& frame); void ApplyBocRootColi(const float_t step); void ApplyPhysics(const mat4& root_matrix, const vec3& hsc, const float_t step, bool disable_ex_force, bool ring_coli, bool has_children_node); @@ -2273,7 +3394,7 @@ struct RobOsage { skin_param_osage_root& skp_root, const object_info& obj_info, const bone_database* bone_data); void RotateMat(mat4& mat, const vec3& hsc, bool init_rot = false); void SetDisableCollision(const bool& value); - void SetMotionResetData(uint32_t motion_id, float_t frame); + void SetMotionResetData(const uint32_t& motnum, const float_t& frame); void SetNodesExternalForce(const vec3* ex_force, const float_t& gain); void SetNodesForce(const float_t& force); const float_t* SetOsagePlayDataInit(const float_t* opdi_data); @@ -2334,23 +3455,22 @@ public: virtual void pos_init_cont() override; virtual void CtrlEnd() override; - void AddMotionResetData(uint32_t motion_id, float_t frame); + void AddMotionResetData(const uint32_t& motnum, const float_t& frame); const float_t* LoadOpdData(size_t node_index, const float_t* opd_data, size_t opd_count); void SetDisableCollision(const bool& value); - void SetMotionResetData(uint32_t motion_id, float_t frame); + void SetMotionResetData(const uint32_t& motnum, const float_t& frame); const float_t* SetOsagePlayDataInit(const float_t* opdi_data); void SetOsageReset(); void SetRing(const osage_ring_data& ring); void SetSkinParam(skin_param_file_data* skp); void SetWindDirection(); - void get_node_list( - const obj_skin_ex_node_osage* osg_data, const obj_skin_osage_joint* joint, - prj::vector_pair& joint_node_list, - std::map& ex_node_list); + void make_joint_map(const obj_skin_ex_node_osage* root, + const obj_skin_osage_joint* joint, prj::vector_pair& joint_map, + std::map& node_name_map); void reset_ex_force(); - void set_data(const rob_chara_item_equip_object* skin_disp, const obj_skin_ex_node_osage* root, - const char* name, const obj_skin_osage_joint* joint, const RobNode* mot_node, + void set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_osage* root, + const obj_skin_osage_joint* joint, const RobNode* mot_node, RobNode* ex_node, const obj_skin* skin); void set_ex_force(const vec3& f); void set_move_cancel(const float_t& mv_ccl); @@ -2385,7 +3505,7 @@ public: void CalcConstraintPosition(mat4 mat); void CalcMatrixHS(); - void set_data(const rob_chara_item_equip_object* skin_disp, const obj_skin_ex_node_constraint* data, + void set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_constraint* data, const char* name, const bone_database* bone_data); }; @@ -2433,18 +3553,19 @@ public: void Calc(); void CalcMatrixHS(); - void set_data(const rob_chara_item_equip_object* skin_disp, const obj_skin_ex_node_expression* data, + void set_data(const RobSkinDisp* skin_disp, const obj_skin_ex_node_expression* data, const char* node_name, object_info objuid, size_t index, const bone_database* bone_data); }; -struct rob_chara_item_equip; +class RobDisp; -struct rob_chara_item_equip_object { +class RobSkinDisp { +public: size_t index; const mat4* motion_matrix; object_info obj_uid; object_info obj_uid_sub; - std::vector texchg_vec; + std::vector texchg_vec; RobSkinCol skn_col; RobSkinOfs skn_ofs; float_t alpha; @@ -2470,21 +3591,20 @@ struct rob_chara_item_equip_object { bool use_opd; const obj_skin_ex_data* skin_ex_data; const obj_skin* skin; - const rob_chara_item_equip* rob_disp; + const RobDisp* rob_disp; - rob_chara_item_equip_object(); - ~rob_chara_item_equip_object(); + RobSkinDisp(); + ~RobSkinDisp(); - void add_motion_reset_data(uint32_t motion_id, float_t frame, int32_t iterations); + void add_motion_reset_data(const uint32_t& motnum, const float_t& frame, int32_t init_cnt); void check_no_opd(std::vector& opd_blend_data); - void clear_ex_data(); + void dest_ex_node(); void disp(const mat4& mat, render_context* rctx); const RobNode* get_node(int32_t index) const; const RobNode* get_node(const char* name, const bone_database* bone_data) const; int32_t get_node_index(const char* name, const bone_database* bone_data) const; const mat4* get_ex_data_bone_node_mat(const char* name); RobJointNode* get_normal_ref_osage_node(const std::string& str, size_t* index); - void set_motion_node(const RobNode* mot_node, const bone_database* bone_data); void init_members(size_t index = 0xDEADBEEF); void pos_reset(int32_t init_cnt); void reset_ex_force(); @@ -2493,18 +3613,22 @@ struct rob_chara_item_equip_object { bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db); void set_alpha_obj_flags(float_t alpha, int32_t flags); bool set_boc(const skin_param_osage_root& skp_root, ExOsageBlock* osg); + void set_col_color(const vec3& blend, const vec3& ofs); + void set_col_specular(const vec3& blend, const vec3& ofs); + void set_col_type(int32_t type); void set_collision_target_osage(const skin_param_osage_root& skp_root, skin_param* skp); void set_disable_collision(rob_osage_parts_bit parts_bits, bool disable); void set_ex_node(obj_skin_ex_data* ex_data); void set_ex_node_block(obj_skin_ex_data* ex_data, const bone_database* bone_data, void* data, const object_database* obj_db); - void set_motion_reset_data(uint32_t motion_id, float_t frame); - void set_motion_skin_param(int8_t chara_id, uint32_t motion_id, int32_t frame); - void set_null_blocks_expression_data(const vec3& position, const vec3& rotation, const vec3& scale); + void set_motion_node(const RobNode* mot_node, const bone_database* bone_data); + void set_motion_reset_data(const uint32_t& motnum, const float_t& frame); + void set_motion_skin_param(int8_t rob_id, uint32_t motnum, int32_t frame); + void set_ofs(const vec3& pos, const vec3& rot, const vec3& scale); void set_osage_play_data_init(const float_t* opdi_data); void set_osage_reset(); void set_osage_move_cancel(const float_t& mv_ccl); - void set_texture_pattern(texture_pattern_struct* tex_pat, size_t count); + void set_tex_change(size_t num, const TexChange* texchg); void skp_load(void* kv, const bone_database* bone_data); void skp_load(const skin_param_osage_root& skp_root, std::vector& vec, skin_param_file_data* skp_file_data, const bone_database* bone_data); @@ -2513,10 +3637,11 @@ struct rob_chara_item_equip_object { bool skp_load_normal_ref(const skin_param_osage_root& skp_root, std::vector* node_data); }; -struct rob_chara_item_equip { +class RobDisp { +public: const RobNode* motion_node; const mat4* motion_matrix; - rob_chara_item_equip_object* skin_disp; + RobSkinDisp* skin_disp; int32_t parts_attr[RPK_MAX]; bool one_skin; int32_t disp_begin; @@ -2524,13 +3649,13 @@ struct rob_chara_item_equip { uint32_t shadow_flag; SHADOW_GROUP shadow_group; vec3 position; - std::vector hyoutan_texchg_list; + std::vector hyoutan_texchg_list; object_info hyoutan_obj; int32_t hyoutan_rpk; bool disable_update; - int32_t field_DC; + HyoutanStat hyoutan_status; vec4 skin_color; - float_t wet; + float_t wet_cloth; float_t wind_strength; bool chara_color; bool npr_flag; @@ -2546,217 +3671,536 @@ struct rob_chara_item_equip { bool parts_append; bool parts_white_one_l; - rob_chara_item_equip(); - ~rob_chara_item_equip(); + RobDisp(); + ~RobDisp(); - void add_motion_reset_data(uint32_t motion_id, float_t frame, int32_t iterations); - void disp(int32_t chara_id, render_context* rctx); - rob_chara_item_equip_object* get_skin_disp(ROB_PARTS_KIND rpk); - object_info get_object_info(ROB_PARTS_KIND rpk); - void set_motion_node(const RobNode* mot_node, const bone_database* bone_data); + void add_motion_reset_data(const uint32_t& motnum, const float_t& frame, int32_t init_cnt); + void disp(int32_t rob_id, render_context* rctx); + object_info get_objid(ROB_PARTS_KIND rpk) const; + RobSkinDisp* get_skin_work(ROB_PARTS_KIND rpk); // Added + const RobSkinDisp* get_skin_work(ROB_PARTS_KIND rpk) const; const mat4* get_ex_data_bone_node_mat(ROB_PARTS_KIND rpk, const char* name); - void load_body_parts_object_info(ROB_PARTS_KIND rpk, object_info obj_info, - const bone_database* bone_data, void* data, const object_database* obj_db); - void load_outfit_object_info(ROB_PARTS_KIND rpk, object_info obj_info, - bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db); + ROB_PARTS_KIND get_free_item(ROB_PARTS_KIND rpk) const; void pos_reset(uint8_t init_cnt); void reset(); void reset_ex_force(); void reset_init_data(RobNode* mot_node); void reset_nodes_ex_force(rob_osage_parts parts); void set_alpha_obj_flags(float_t alpha, mdl::ObjFlags flags); - void set_disable_collision(rob_osage_parts parts, bool disable); - void set_disp(ROB_PARTS_KIND rpk, bool value); - void set_item(object_info obj_uid, ROB_PARTS_KIND rpk, bool osage_reset, + void set_base(ROB_PARTS_KIND rpk, object_info obj_uid, bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db); - void set_motion_reset_data(uint32_t motion_id, float_t frame); - void set_motion_skin_param(int8_t chara_id, uint32_t motion_id, int32_t frame); - void set_null_blocks_expression_data(ROB_PARTS_KIND rpk, - const vec3& position, const vec3& rotation, const vec3& scale); - void set_object_texture_pattern(ROB_PARTS_KIND rpk, texture_pattern_struct* tex_pat, size_t count); + void set_body(object_info obj_uid, + const bone_database* bone_data, void* data, const object_database* obj_db); + void set_col_color(ROB_PARTS_KIND rpk, const vec3& blend, const vec3& ofs); + void set_col_specular(ROB_PARTS_KIND rpk, const vec3& blend, const vec3& ofs); + void set_col_type(ROB_PARTS_KIND rpk, int32_t type); + void set_disable_collision(rob_osage_parts parts, bool disable); + void set_disp_flag(ROB_PARTS_KIND rpk, bool flag); + void set_hyoutan(ROB_PARTS_KIND rpk, object_info obj_uid, object_info obj_uid_sub, + const bone_database* bone_data, void* data, const object_database* obj_db); + void set_hyoutan_tex_change(const TexChange* texchg, int32_t tex_num); + void set_item(ROB_PARTS_KIND rpk, object_info obj_info, + const bone_database* bone_data, void* data, const object_database* obj_db); + void set_merge(ROB_PARTS_KIND rpk, bool flag); + void set_motion_node(const RobNode* mot_node, const bone_database* bone_data); + void set_motion_reset_data(const uint32_t& motnum, const float_t& frame); + void set_motion_skin_param(int8_t chara_id, uint32_t motnum, int32_t frame); + void set_ofs(ROB_PARTS_KIND rpk, const vec3& trans, const vec3& rot, const vec3& scale); void set_one_skin(bool value); void set_opd_blend_data(std::list* a2); void set_osage_play_data_init(ROB_PARTS_KIND rpk, const float_t* opdi_data); void set_osage_reset(); void set_osage_step(float_t value); void set_osage_move_cancel(uint8_t id, const float_t& mv_ccl); - void set_shadow_group(int32_t chara_id); - void set_texture_pattern(texture_pattern_struct* tex_pat, size_t count); + void set_reflect(ROB_PARTS_KIND rpk, bool flag); + void set_shadow(ROB_PARTS_KIND rpk, bool flag); + void set_shadow_group(int32_t rob_id); + void set_skin(object_info obj_uid, ROB_PARTS_KIND kind, bool osage_reset, + const bone_database* bone_data, void* data, const object_database* obj_db); + void set_tex_change(ROB_PARTS_KIND rpk, const TexChange* texchg, int32_t tex_num); void skp_load(ROB_PARTS_KIND rpk, const skin_param_osage_root& skp_root, std::vector& vec, skin_param_file_data* skp_file_data, const bone_database* bone_data); }; -struct item_cos_texture_change_tex { - texture* org; - texture* chg; - bool changed; +struct RobItemTXHD { + texture* src; + texture* dst; + bool dst_copy; - item_cos_texture_change_tex(); - ~item_cos_texture_change_tex(); + RobItemTXHD(); + ~RobItemTXHD(); }; -struct rob_chara_item_cos_data { - CHARA_NUM curr_chara_num; - CHARA_NUM chara_num; - item_cos_data curr_cos; - item_cos_data cos; - std::map> texture_change; - std::map> item_change; - std::map field_F0; - std::map field_100; - std::vector texture_pattern[31]; - std::map head_replace; +struct RobItemHavePart { + std::vector item_no; - rob_chara_item_cos_data(); - ~rob_chara_item_cos_data(); + RobItemHavePart() = default; + ~RobItemHavePart() = default; +}; - bool check_for_npr_flag(); - const item_cos_data* get_cos(); - object_info get_head_object_replace(int32_t head_object_id); - float_t get_max_face_depth(); - void reload_items(int32_t chara_id, +struct RobItemHave { + RobItemHavePart part[ROB_ITEM_EQUIP_ID_MAX]; + + RobItemHave() = default; + ~RobItemHave() = default; +}; + +struct RobItemHaveSub { + RobItemHavePart part[ROB_ITEM_EQUIP_SUB_ID_MAX]; + + RobItemHaveSub() = default; + ~RobItemHaveSub() = default; +}; + +typedef prj::vector_pair_combine RobItemDbgSet; + +class RobItem { +private: + CHARA_NUM m_cn; + CHARA_NUM m_cn_load; + RobItemEquip m_equip; + RobItemEquip m_equip_load; + std::map> m_txhd_map; + std::map> m_nude_attr_map; + std::map m_rpk_map; + std::map m_rpk_sp_map; + std::vector m_texchg_list[RPK_MAX]; + std::map m_head_map; + +private: + void equip_phase0(RobItemEquip* item_set); + void equip_phase1(RobDisp* rdp, const bone_database* bone_data, void* data, const object_database* obj_db); - void set_chara_num(CHARA_NUM chara_num); - void set_chara_num_item(CHARA_NUM chara_num, int32_t item_no); - void set_chara_num_item_nos(CHARA_NUM chara_num, const int32_t* items); - void set_chara_num_item_zero(CHARA_NUM chara_num, int32_t item_no); - void set_item(int32_t item_no); - void set_item_array(const rob_chara_pv_data_item& item); - 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_disp, - ROB_PARTS_KIND rpk, bool tex_pat_for_all); - void set_texture_pattern(rob_chara_item_equip* rob_disp, - uint32_t item_no, ROB_PARTS_KIND rpk, bool tex_pat_for_all); - void set_texture_pattern(rob_chara_item_equip* rob_disp, - const std::vector& item_nos, ROB_PARTS_KIND rpk, bool tex_pat_for_all); - void texture_change_clear(); - void texture_pattern_clear(); + void equip_phase2(RobDisp* rdp, RobItemEquip* item_set, + const bone_database* bone_data, void* data, const object_database* obj_db); + void equip_phase3(RobDisp* rdp, RobItemEquip* item_set, + const bone_database* bone_data, void* data, const object_database* obj_db); + void equip_phase4(RobDisp* rdp, RobItemEquip* item_set, + const bone_database* bone_data, void* data, const object_database* obj_db); + void equip_phase5(RobDisp* rdp, RobItemEquip* item_set); + void equip_phase6(RobDisp* rdp, RobItemEquip* item_set); + void equip_phase6(RobDisp* rdp, RobItemEquip* item_set, uint32_t item_no); + void equip_phase7(); + ROB_PARTS_KIND get_rpk_item(ROB_ITEM_EQUIP_SUB_ID id) const; + void hide_rpk_sp(RobDisp* rdp, int32_t rpk_sp, + const bone_database* bone_data, void* data, const object_database* obj_db); + void make_chg_tex(uint32_t item_no, const RobItemTable* tbl); + void free_copy_texture_all(); + void init_nude_attr_map(); + void make_nude_attr_map(uint32_t item_no, const RobItemTable* tbl); + void set_obj_phase2(RobDisp* rdp, uint32_t item_no, const RobItemTable* tbl, ROB_ITEM_EQUIP_SUB_ID id, + const bone_database* bone_data, void* data, const object_database* obj_db); + void set_obj_phase3(RobDisp* rdp, uint32_t item_no, const RobItemTable* tbl, + const bone_database* bone_data, void* data, const object_database* obj_db); + void set_texture(RobDisp* rdp, + const std::vector& item_nos, ROB_PARTS_KIND rpk, bool is_hyoutan = false); + void set_texture(RobDisp* rdp, uint32_t item_no, ROB_PARTS_KIND rpk, bool is_hyoutan = false); + void reset_texture(RobDisp* rdp, ROB_PARTS_KIND rpk, bool is_hyoutan = false); + void clear_texchg_list(); + void disp_obj_internal(object_info obj_uid, mat4& mat, uint32_t item_no, render_context* rctx); + //static bool s_check_equip_exclusion(CHARA_NUM cn, RobItemEquip*); + //static bool s_check_equip_sub(CHARA_NUM cn, int32_t, const RobItemHeader*, RobItemEquip*, const PlayerInformation*); + //static bool s_check_equip_sub_phase0(uint32_t, const RobItemHeader*); + //static bool s_check_equip_sub_phase1(CHARA_NUM cn, uint32_t); + //static bool s_check_equip_sub_phase2(CHARA_NUM cn, uint32_t, int32_t); + //static bool s_check_equip_sub_phase3(CHARA_NUM cn, uint32_t, const pd::PlayerBitfield<2000>&); + //static bool s_check_equip_sub_phase4(CHARA_NUM cn, uint32_t, int32_t); + //static bool s_check_equip_sub_phase5(CHARA_NUM cn, int32_t, uint32_t); + //static bool s_check_equip_chara(CHARA_NUM, int32_t, RobItemEquip*); + //static bool s_check_equip_point(CHARA_NUM, const RobItemHeader*, const RobItemEquip*); + static bool s_repair_equip(CHARA_NUM, uint32_t, int32_t, RobItemEquip* item_set); + + static int32_t s_have_dbg_ref; + static RobItemHave s_have_dbg[]; + static int32_t s_have_sub_dbg_ref; + static RobItemHaveSub s_have_sub_dbg[]; + +public: + RobItem(); + ~RobItem(); + void set_chara_num(CHARA_NUM cn); + void req_obj(uint32_t item_no, void* data, const object_database* obj_db); + bool wait_obj(uint32_t item_no); + void free_obj(uint32_t item_no); + void req_obj_all(void* data, const object_database* obj_db); + bool wait_obj_all(); + void free_obj_all(); + void free_obj_diff(); + +private: + void regist_item(ROB_ITEM_EQUIP_SUB_ID id, uint32_t item_no); + +public: + void regist_item_one(uint32_t item_no); + void regist_item_all(const RobItemEquip* item_set); + void delete_item(uint32_t item_no); + void equip(int32_t rc, const bone_database* bone_data, + void* data, const object_database* obj_db); + ROB_ITEM_EQUIP_ID get_equip_id(uint32_t item_no) const; + ROB_ITEM_EQUIP_SUB_ID get_equip_sub_id(uint32_t item_no) const; + uint32_t check_exclusive_item(uint32_t item_no) const; + RobItemEquip* get_equip(); + const RobItemEquip* get_equip() const; + bool is_equipped_item(uint32_t item_no) const; + //const char* get_name(uint32_t item_no) const; + //const char* get_name_asc(uint32_t item_no) const; + void init_disp_obj(uint32_t item_no); + void disp_obj(uint32_t item_no, render_context* rctx, const mat4& mat); + void get_item_texchange_list(uint32_t item_no, std::vector& tex_chg_list); + RobItemEquip* get_equip_load(); + const RobItemEquip* get_equip_load() const; + + void regist_item_all(const RobItemEquipInit* item_set); + void free_copy_texture(uint32_t item_no); + void free_copy_texture(std::map>::iterator elem); + + bool check_for_npr_flag() const; + object_info get_head_object_replace(int32_t head_object_id) const; + float_t get_face_depth() const; + + static const char* s_get_equip_sub_id_str(ROB_ITEM_EQUIP_SUB_ID id); + //static bool s_check_equip(CHARA_NUM cn, int32_t, RobItemEquip*, const void*); + //static void s_get_objset(CHARA_NUM cn, uint32_t, int32_t*, size_t); + static const char* s_get_name(const CHARA_NUM& cn, uint32_t item_no); + static ROB_ITEM_EQUIP_ID s_get_equip_id(CHARA_NUM cn, uint32_t item_no); + static ROB_ITEM_EQUIP_SUB_ID s_get_equip_sub_id(CHARA_NUM cn, uint32_t item_no); + static void s_get_equip_sub_group(int32_t id, std::vector* sub_group); + static bool s_is_replace_part(CHARA_NUM cn, uint32_t item_no, ROB_ITEM_EQUIP_SUB_ID id); + static bool s_equip_ok(CHARA_NUM cn, uint32_t item_no, ROB_ITEM_EQUIP_SUB_ID id); + //static bool s_have_costume(CHARA_NUM cn, int32_t, const void*); + static uint32_t s_get_exclusion(CHARA_NUM cn, uint32_t item_no); + //static uint32_t s_get_set_item_no(CHARA_NUM cn, uint32_t item_no); + static uint32_t s_get_point(CHARA_NUM cn, uint32_t item_no); + static void s_get_offset_list(CHARA_NUM cn, uint32_t item_no, std::vector& ofs_list, bool clear); + static ROB_ITEM_TYPE s_get_type(CHARA_NUM cn, uint32_t item_no); + static bool s_is_texorg(CHARA_NUM cn, uint32_t item_no); + static bool s_is_objorg(CHARA_NUM cn, uint32_t item_no); + //static void s_get_ng_item(); + //static void s_get_ng_item_name(); + //static void s_get_ng_item_point(); + //static bool s_check_ng_item(CHARA_NUM cn, uint32_t item_no); + static std::string s_check_ng_item_name(CHARA_NUM cn, uint32_t item_no); + static int32_t s_check_ng_item_point(CHARA_NUM cn, uint32_t item_no); + static uint32_t get_dbgset_num(CHARA_NUM cn); + static const RobItemDbgSet* get_dbgset(CHARA_NUM cn); + static void init_have_dbg(); + static void dest_have_dbg(); + static void init_have_sub_dbg(); + static void dest_have_sub_dbg(); + static RobItemHave* get_have_dbg(CHARA_NUM cn); + static RobItemHaveSub* get_have_sub_dbg(CHARA_NUM cn); + + static void s_req_obj(CHARA_NUM cn, uint32_t item_no, void* data, const object_database* obj_db); + static bool s_wait_obj(CHARA_NUM cn, uint32_t item_no); + static void s_free_obj(CHARA_NUM cn, uint32_t item_no); + static void s_req_obj_all(CHARA_NUM cn, const RobItemEquip* item_set, void* data, const object_database* obj_db); + static bool s_wait_obj_all(CHARA_NUM cn, const RobItemEquip* item_set); + static void s_free_obj_all(CHARA_NUM cn, const RobItemEquip* item_set); + + static void s_regist_item_one(CHARA_NUM cn, uint32_t item_no, RobItem* rob_item); + static void s_regist_item_all(CHARA_NUM cn, const RobItemEquip* item_set, RobItem* rob_item); + static void s_delete_item(CHARA_NUM cn, uint32_t item_no, RobItem* rob_item); }; -struct struc_525 { - int32_t field_0; - int32_t field_4; +union RobFlag { + uint32_t u32; + struct { + int8_t disp : 1; + int8_t fix_hara : 1; + int8_t ringout : 1; + int8_t bound_wall : 1; + int8_t compel : 1; + int8_t pl_syagami : 1; + int8_t land : 1; + int8_t old_fix_hara : 1; + int8_t invincible : 1; + int8_t yokerare : 1; + int8_t yokerare_mot : 1; + int8_t wall_hit_ok : 1; + int8_t own_down_pose : 1; + int8_t time_up : 1; + int8_t kabe_yoroke : 1; + int8_t jump_rise : 1; + int8_t round_loser : 1; + int8_t wall_fix_ok : 1; + int8_t wall_fix_ng : 1; + int8_t not_normal : 1; + int8_t old_not_normal : 1; + int8_t mk_change_off : 1; + int8_t wall_moved_mot : 1; + int8_t dmy_yokerare : 1; + int8_t yoketa : 1; + int8_t yokerare_mot2 : 1; + int8_t mk_yoke_off : 1; + int8_t set_damage : 1; + int8_t rf_28 : 1; + int8_t rf_29 : 1; + int8_t rf_30 : 1; + int8_t no_ctrl : 1; + } bit; }; -struct struc_524 { - int32_t field_0; - struc_525 field_4; - uint32_t motion_id; - int8_t field_10; +struct RobJump { + float_t frame; + float_t zvec; + float_t next_land_frame; + float_t land_time; + + RobJump(); + + void init(); }; -struct struc_523 { - int8_t field_0; - int8_t field_1; - int32_t field_4; - int16_t field_8; - int32_t field_C; - vec3 field_10; - int32_t field_1C; - int32_t field_20; - int32_t field_24; - int32_t field_28; - int32_t field_2C; - int32_t field_30; - int32_t field_34; - int32_t field_38; - int32_t field_3C; - int32_t field_40; - int32_t field_44; - int32_t field_48; - int32_t field_4C; - int8_t field_50; - int32_t field_54; +union RobAttackResult { + uint32_t u32; + struct { + int8_t hit : 1; + int8_t down : 1; + int8_t counter : 1; + int8_t l_counter : 1; + int8_t m_counter : 1; + int8_t mf_5 : 1; + int8_t air : 1; + int8_t air_counter : 1; + int8_t finish : 1; + int8_t finish_air : 1; + int8_t guard : 1; + int8_t guard_hazushi : 1; + int8_t guard_half : 1; + int8_t yoroke : 1; + int8_t down_attack : 1; + int8_t land_attack : 1; + int8_t mf_16 : 1; + int8_t hajiki : 1; + int8_t follow_hit : 1; + int8_t normal_hit : 1; + int8_t ura_hit : 1; + int8_t side_counter : 1; + int8_t side_l_counter : 1; + int8_t side_m_counter : 1; + int8_t yoroke_l_counter : 1; + int8_t side_hit : 1; + int8_t yoroke_counter : 1; + int8_t yoroke_follow : 1; + int8_t stun_begin : 1; + int8_t stun_hit : 1; + int8_t syagami_hit : 1; + int8_t bd_counter : 1; + } bit; +}; + +union RobAttackFlag { + uint32_t u32; + struct { + int8_t hit_ng : 1; + int8_t both_hit : 1; + int8_t hit_yokerare : 1; + int8_t old_hit_yokerare : 1; + } bit; +}; + +struct RobAttack { + int16_t hit_timer; + RobAttackFlag flag; + RobAttackResult ar_flag; + RobAttackResult ar_mask; + RobAttackResult old_ar_flag; + RobAttackResult old_ar_mask; + RobAttackResult ar_flag_c; + RobAttackResult ar_mask_c; + bool first_hit_result; + RobAttackResult cmb_first_ar_mask; + int32_t cmb_node_cnt; + bool next_attack_wait; + int8_t sideturn_stop_counter; + + RobAttack(); + + void init(); +}; + +struct ActParam { + uint32_t flag; + uint32_t type; + + ActParam(); + + void init(); +}; + +struct RobActType { + ACT_NAME name; + ActParam act_param; + uint32_t motnum; + bool mirror; + + RobActType(); + + void setup(); +}; + +struct RobGuard { + GuardKind guard_kind; + prj::BitArray<5> guard_input; + + RobGuard(); + + void init(); +}; + +struct RobYarare { + int16_t get_damage; + float_t get_power; + RobAngle yarare_yang; + RobAttackResult hit_ar_mask; + vec3 efc_spd; + vec3 get_spd; + vec3 ringout_spd; + int16_t combo_count; + int16_t combo_damage; + int16_t down_combo_count; + int16_t down_combo_damage; + int16_t down_combo_count2; + int16_t down_combo_damage2; + int16_t down_combo_count3; + int16_t down_combo_count4; + int16_t nage_combo_count; + int16_t nage_combo_damage; + int16_t air_combo_count; + int16_t air_combo_damage; + uint32_t combo_flag; + bool combo_xang_offs; std::list field_58; - int64_t field_68; - int64_t field_70; - int32_t field_78; - float_t field_7C; - float_t field_80; + int16_t max_nowall_combo_count; + int16_t max_nowall_combo_damage; + int16_t max_wall_combo_count; + int16_t max_wall_combo_damage; + int16_t max_current_combo_count; + int16_t max_current_combo_damage; + int16_t mot_get_damage; + int16_t real_get_damage; + int16_t orig_get_damage; + float_t gs_resist_timer; + float_t gs_resist_step; - struc_523(); - ~struc_523(); + RobYarare(); + ~RobYarare(); + + void init(); }; -struct struc_526 { - int32_t field_0; - int32_t field_4; +struct RobNage { + float_t disable_timer; + int8_t nagerare_cnt; + int16_t kaeshi_damage; + rob_chara* enemy; + bool right_side; + RobAngle tgt_yang; + vec3 tgt_pos; + float_t tgt_timer; + + RobNage(); + + void init(); }; -struct struc_264 { - int8_t field_0; - struc_524 field_4; - struc_524 field_18; - struc_524 field_2C; - struc_524 field_40; - struc_524 field_54; - int32_t field_68; - int32_t field_6C; - int32_t field_70; - float_t field_74; - int16_t field_78; - int32_t field_7C; - int32_t field_80; - int32_t field_84; - int32_t field_88; - int32_t field_8C; - int32_t field_90; - int32_t field_94; - int8_t field_98; - int32_t field_9C; - int32_t field_A0; - int8_t field_A4; - int8_t field_A5; - int32_t field_A8; - int32_t field_AC; +struct RobRise { + uint32_t motnum; + float_t hurry; + float_t down_timer; + + RobRise(); + + void init(); +}; + +union RobUkemiKind { + uint32_t u32; + struct { + int8_t ukemi_ok : 1; + int8_t ukemi_wait : 1; + int8_t ukemi_wait_just : 1; + int8_t ukemi_dir : 1; + int8_t ukemi_now : 1; + int8_t ukemi_air : 1; + int8_t ukemi_select : 1; + int8_t ukemi_land : 1; + int8_t ukemi_delay : 1; + int8_t ukemi_dir2 : 1; + } bit; +}; + +struct RobUkemi{ + RobUkemiKind ukemi_kind; + float_t land_elapsed; + + RobUkemi(); + + void init(); +}; + +struct RobOffensiveMove { + float_t offmv_timer; + bool revise_grd_emy_no; + vec3 target_pos; + union { + uint32_t u32; + struct { + int8_t en_from_right : 1; + } bit; + } target_flag; + + RobOffensiveMove(); + + void init(); +}; + +struct RobSideTurn { + float_t side_stop_counter; + float_t side_guard_disable; + float_t side_turn_timer; + bool right_side_turn; + + RobSideTurn(); + + void init(); +}; + +struct RobAction { + int8_t step; + RobActType action; + RobActType old_action; + RobActType command; + RobActType bak_command; + RobActType sys_command; + RobJump jump; + RobAttack attack; + RobGuard guard; int32_t field_B0; bool field_B4; - struc_523 field_B8; - int32_t field_140; - int8_t field_144; - int8_t field_145; - int16_t field_146; - void* field_148; - int8_t field_150; - int16_t field_152; - int32_t field_154; - int32_t field_158; - int32_t field_15C; - int32_t field_160; - int32_t field_164; - int32_t field_168; - int32_t field_16C; - int32_t field_170; - int32_t field_174; - int32_t field_178; - int32_t field_17C; - int8_t field_180; - int32_t field_184; - int32_t field_188; - float_t field_18C; - int8_t field_190; - int32_t field_194; - int32_t field_198; - int32_t field_19C; - int32_t field_1A0; + RobYarare yarare; + RobNage nage; + RobRise rise; + RobUkemi ukemi; + RobOffensiveMove off_move; + RobSideTurn side_turn; uint8_t kamae_type; const RobKamae* kamae_data; - int32_t field_1B0; - int32_t field_1B4; - int32_t field_1B8; - int32_t field_1BC; - struc_526 field_1C0; - int8_t field_1C8; - int8_t field_1C9; - int8_t field_1CA; - int32_t field_1CC; - int32_t field_1D0; - int32_t field_1D4; + float_t down_counter; + float_t down_counter_ex; + float_t old_down_counter; + uint32_t mot_backup; + prj::BitArray<36> kaeshi_flag; + int16_t gacha_count; + bool gacha; + int32_t drank_count; + int32_t drank_add_req; + float_t wall_yoroke_timer; - struc_264(); - ~struc_264(); + RobAction(); + ~RobAction(); + + void init(); }; class SubActParam { @@ -2815,10 +4259,10 @@ public: SubActExec(SubActExecType type); virtual ~SubActExec(); - virtual void Field_8() = 0; - virtual void Field_10(SubActParam* param) = 0; - virtual void Field_18(rob_chara* rob_chr) = 0; - virtual void Field_20(rob_chara* rob_chr) = 0; + virtual void init() = 0; + virtual void set(const SubActParam* param) = 0; + virtual void Field_18(rob_chara* impl) = 0; + virtual void Field_20(rob_chara* impl) = 0; }; class SubActExecAngry : public SubActExec { @@ -2826,10 +4270,10 @@ public: SubActExecAngry(); virtual ~SubActExecAngry() override; - virtual void Field_8() override; - virtual void Field_10(SubActParam* param) override; - virtual void Field_18(rob_chara* rob_chr) override; - virtual void Field_20(rob_chara* rob_chr) override; + virtual void init() override; + virtual void set(const SubActParam* param) override; + virtual void Field_18(rob_chara* impl) override; + virtual void Field_20(rob_chara* impl) override; }; class SubActExecCountNum : public SubActExec { @@ -2841,10 +4285,10 @@ public: SubActExecCountNum(); virtual ~SubActExecCountNum() override; - virtual void Field_8() override; - virtual void Field_10(SubActParam* param) override; - virtual void Field_18(rob_chara* rob_chr) override; - virtual void Field_20(rob_chara* rob_chr) override; + virtual void init() override; + virtual void set(const SubActParam* param) override; + virtual void Field_18(rob_chara* impl) override; + virtual void Field_20(rob_chara* impl) override; }; class SubActExecCry : public SubActExec { @@ -2852,10 +4296,10 @@ public: SubActExecCry(); virtual ~SubActExecCry() override; - virtual void Field_8() override; - virtual void Field_10(SubActParam* param) override; - virtual void Field_18(rob_chara* rob_chr) override; - virtual void Field_20(rob_chara* rob_chr) override; + virtual void init() override; + virtual void set(const SubActParam* param) override; + virtual void Field_18(rob_chara* impl) override; + virtual void Field_20(rob_chara* impl) override; }; class SubActExecEmbarrassed : public SubActExec { @@ -2864,10 +4308,10 @@ public: SubActExecEmbarrassed(); virtual ~SubActExecEmbarrassed() override; - virtual void Field_8() override; - virtual void Field_10(SubActParam* param) override; - virtual void Field_18(rob_chara* rob_chr) override; - virtual void Field_20(rob_chara* rob_chr) override; + virtual void init() override; + virtual void set(const SubActParam* param) override; + virtual void Field_18(rob_chara* impl) override; + virtual void Field_20(rob_chara* impl) override; }; class SubActExecLaugh : public SubActExec { @@ -2875,10 +4319,10 @@ public: SubActExecLaugh(); virtual ~SubActExecLaugh() override; - virtual void Field_8() override; - virtual void Field_10(SubActParam* param) override; - virtual void Field_18(rob_chara* rob_chr) override; - virtual void Field_20(rob_chara* rob_chr) override; + virtual void init() override; + virtual void set(const SubActParam* param) override; + virtual void Field_18(rob_chara* impl) override; + virtual void Field_20(rob_chara* impl) override; }; class SubActExecShakeHand : public SubActExec { @@ -2890,113 +4334,102 @@ public: SubActExecShakeHand(); virtual ~SubActExecShakeHand() override; - virtual void Field_8() override; - virtual void Field_10(SubActParam* param) override; - virtual void Field_18(rob_chara* rob_chr) override; - virtual void Field_20(rob_chara* rob_chr) override; -}; - -union RobFlag { - uint32_t u32; - struct { - int8_t disp : 1; - int8_t fix_hara : 1; - int8_t ringout : 1; - int8_t bound_wall : 1; - - int8_t compel : 1; - int8_t pl_syagami : 1; - int8_t land : 1; - int8_t old_fix_hara : 1; - - int8_t invincible : 1; - int8_t yokerare : 1; - int8_t yokerare_mot : 1; - int8_t wall_hit_ok : 1; - - int8_t own_down_pose : 1; - int8_t time_up : 1; - int8_t kabe_yoroke : 1; - int8_t jump_rise : 1; - - int8_t round_loser : 1; - int8_t wall_fix_ok : 1; - int8_t wall_fix_ng : 1; - int8_t not_normal : 1; - - int8_t old_not_normal : 1; - int8_t mk_change_off : 1; - int8_t wall_moved_mot : 1; - int8_t dmy_yokerare : 1; - - int8_t yoketa : 1; - int8_t yokerare_mot2 : 1; - int8_t mk_yoke_off : 1; - int8_t set_damage : 1; - - int8_t rf_28 : 1; - int8_t rf_29 : 1; - int8_t rf_30 : 1; - int8_t rf_31 : 1; - } bit; + virtual void init() override; + virtual void set(const SubActParam* param) override; + virtual void Field_18(rob_chara* impl) override; + virtual void Field_20(rob_chara* impl) override; }; struct RobSubAction { - struct Data { - SubActExec* field_0; - SubActExec* field_8; - SubActParam* param; - SubActExec* field_18; - SubActExecCry cry; - SubActExecShakeHand shake_hand; - SubActExecEmbarrassed embarrassed; - SubActExecAngry angry; - SubActExecLaugh laugh; - SubActExecCountNum count_num; - - Data(); - ~Data(); - } data; + SubActExec* field_8; + SubActExec* field_10; + SubActParam* param; + SubActExec* field_20; + SubActExecCry cry; + SubActExecShakeHand shake_hand; + SubActExecEmbarrassed embarrassed; + SubActExecAngry angry; + SubActExecLaugh laugh; + SubActExecCountNum count_num; RobSubAction(); - ~RobSubAction(); + virtual ~RobSubAction(); - void Reset(); - void SetSubActParam(SubActParam* value); + void dest(); + void init(); + void set(SubActParam* value); }; -struct rob_chara_motion_frame_data { - float_t frame; - float_t prev_frame; - float_t last_set_frame; +struct RobMotionFrame { + float_t f; + float_t old_f; + float_t req_f; }; -struct rob_chara_motion_step_data { - float_t frame; - float_t field_4; - float_t step; +struct RobMotionStep { + float_t f; + float_t old_f; + float_t req_f; +}; + +union RobMotFlag { + uint32_t u32; + struct { + int8_t mot_end : 1; + int8_t next_null : 1; + int8_t next_mirror : 1; + int8_t mirror : 1; + int8_t change : 1; + int8_t frame_change : 1; + int8_t frame_ctrl : 1; + int8_t ext_frame_req : 1; + int8_t suspend : 1; + int8_t resume : 1; + int8_t frame_stop : 1; + int8_t mf_11 : 1; + int8_t mf_12 : 1; + int8_t mf_13 : 1; + int8_t mf_14 : 1; + int8_t mf_15 : 1; + int8_t mf_16 : 1; + int8_t mf_17 : 1; + int8_t mf_18 : 1; + int8_t mf_19 : 1; + int8_t mf_20 : 1; + int8_t mf_21 : 1; + int8_t mf_22 : 1; + int8_t mf_23 : 1; + int8_t mf_24 : 1; + int8_t mf_25 : 1; + int8_t mf_26 : 1; + int8_t mf_27 : 1; + int8_t mf_28 : 1; + int8_t mf_29 : 1; + int8_t mf_30 : 1; + int8_t mf_31 : 1; + } bit; }; class RobPartialMotion { public: struct Data { - uint32_t motion_id; - int32_t mottbl_index; + uint32_t motnum; + MOTTABLE_TYPE mottbl_type; rob_partial_motion_playback_state playback_state; float_t frame; float_t step; - float_t frame_count; + float_t frame_max; float_t blend_duration; float_t blend_step; float_t blend_offset; float_t play_duration; - rob_chara_motion_frame_data* frame_data; - rob_chara_motion_step_data* step_data; + const RobMotionFrame* frame_ptr; + const RobMotionStep* step_ptr; rob_partial_motion_loop_state loop_state; - inline Data() : motion_id(-1), mottbl_index(), playback_state(ROB_PARTIAL_MOTION_PLAYBACK_NONE), frame(), - step(), frame_count(), blend_duration(), blend_step(), blend_offset(), play_duration(), - frame_data(), step_data(), loop_state(ROB_PARTIAL_MOTION_LOOP_NONE) { + inline Data() : motnum(-1), mottbl_type(), playback_state(ROB_PARTIAL_MOTION_PLAYBACK_NONE), frame(), + step(), frame_max(), blend_duration(), blend_step(), blend_offset(), play_duration(), + frame_ptr(), step_ptr(), loop_state(ROB_PARTIAL_MOTION_LOOP_NONE) { Reset(); } @@ -3005,18 +4438,18 @@ public: } inline void Reset() { - motion_id = -1; - mottbl_index = 6; + motnum = -1; + mottbl_type = MTP_FACE_NULL; playback_state = ROB_PARTIAL_MOTION_PLAYBACK_NONE; frame = 0.0f; step = 1.0f; - frame_count = 0.0f; + frame_max = 0.0f; blend_duration = 0.0f; blend_step = 1.0f; blend_offset = 1.0f; play_duration = 0.0f; - frame_data = 0; - step_data = 0; + frame_ptr = 0; + step_ptr = 0; loop_state = ROB_PARTIAL_MOTION_LOOP_NONE; } } data; @@ -3123,7 +4556,7 @@ struct rob_chara_data_adjust { vec3 curr_ex_force; float_t curr_force; float_t curr_strength; - uint32_t motion_id; + uint32_t motnum; float_t set_frame; float_t transition_duration; int32_t type; @@ -3160,7 +4593,7 @@ struct rob_chara_data_hand_adjust { vec3 offset; vec3 target; float_t arm_length; - int32_t iterations; + int32_t init_cnt; rob_chara_data_hand_adjust(); @@ -3178,28 +4611,25 @@ struct rob_chara_data_arm_adjust { void reset(); }; -struct rob_chara_motion { - uint32_t motion_id; - uint32_t prev_motion_id; - rob_chara_motion_frame_data frame_data; - rob_chara_motion_step_data step_data; - float_t step; - int32_t field_24; - uint8_t field_28; - uint8_t field_29; - uint8_t field_2A; - int32_t loop_index; - uint32_t field_30; - int16_t field_34; - int16_t field_36; +struct RobMotion { + uint32_t num; + uint32_t old_num; + RobMotionFrame frame; + RobMotionStep step; + float_t osage_step; + MOT_BSTEP basic_step; + RobMotFlag flag; + int32_t repeat_count; + prj::BitArray<23> shift_req; + int16_t same_mot_idx; + int16_t same_count; int32_t field_38[32]; int32_t field_B8[32]; - float_t field_138; - float_t field_13C; - vec3 field_140; - int32_t field_14C; + float_t mot_adjust_scale; + float_t mot_xz_adjust_scale; + vec3 mot_adjust_base_pos; + uint32_t face_motnum; struc_405 field_150; - float_t field_314; RobHandMotion hand_l; RobHandMotion hand_r; object_info hand_l_object; @@ -3213,277 +4643,271 @@ struct rob_chara_motion { rob_chara_data_hand_adjust hand_adjust_prev[2]; rob_chara_data_arm_adjust arm_adjust[2]; - rob_chara_motion(); - ~rob_chara_motion(); + RobMotion(); + ~RobMotion(); void reset(); }; -struct struc_228 { - int32_t field_0; - int32_t field_4; - uint32_t field_8; - int32_t field_C; +struct CtrlDMot { + CtrlDMot(); + + uint32_t mot_id; + uint32_t mot_flag; }; -struct struc_227 { - int32_t field_0; - float_t field_4; - float_t field_8; +class RobMotId : public CtrlDMot { +public: + RobMotId(); + + void clear(); + void set(uint32_t in_mot_id, uint32_t in_mot_flag); }; -struct mothead_data { - mothead_data_type type; - int32_t frame; - const void* data; +struct RobMotDAs { + float_t count; + float_t follow2; + float_t nagerenai; + + RobMotDAs(); + + void clear(); }; -struct mothead_mot_data { +struct MhdKind { + uint32_t mhk_kind[4]; +}; + +struct MhdList { int32_t type; - const void* data; + void* data; }; -struct mothead_mot { - struc_228 field_0; - int16_t field_10; - int16_t field_12; - mothead_mot_data* mot_data; - mothead_data* data; - int64_t* field_28; - - mothead_mot(); +struct MhpList { + int32_t type; + int32_t frame; + void* data; }; -struct mothead { - uint32_t mot_set_id; - uint32_t first_mot_id; - uint32_t last_mot_id; - mothead_mot** mots; - - mothead(); +struct MhcList { + void* data; }; -struct mothead_file { - uint32_t mot_set_id; - uint32_t first_mot_id; - uint32_t last_mot_id; - uint32_t mot_offsets_offset; +struct MhdData { + MhdKind mot_kind; + uint16_t start_style; + uint16_t end_style; + MhdList* mh_list; + MhpList* pp_list; + MhcList* cm_list; + + MhdData(); }; -struct mothead_modern_file { - uint32_t mot_set_id; - int32_t mot_count; - int64_t hashes_offset; - int64_t mot_offsets_offset; +struct MhdFileHeader { + uint32_t file_id; + uint32_t min_mot_id; + uint32_t max_mot_id; + MhdData** data_list; + + MhdFileHeader(); }; -struct mothead_mot_file { - int32_t field_0; - int32_t field_4; - int32_t field_8; - int32_t field_C; - int16_t field_10; - int16_t field_12; - uint32_t mot_data_offset; - uint32_t data_offset; - uint32_t field_1C; +struct ES_DATA { + int16_t est_land_xang; + int16_t est_down_xang; + int16_t est_down_air_xang; + int16_t est_counter_down_xang; + int16_t est_yoroke_down_xang; + float_t est_power; + float_t est_guard_power; + float_t est_land_power; + float_t est_down_power; + float_t est_down_air_power; + float_t est_counter_down_power; + float_t est_yoroke_down_power; + float_t est_finish_mul_yspd; + float_t est_finish_mul_xzspd; }; -struct struc_377 { - const mothead_data* current; - const mothead_data* data; - bool is_x; // X +struct MhdAttackSound { + int8_t mhats_efc_sound_type; + int32_t mhats_efc_sound_code; + int16_t mhats_efc_sound_cond; }; -struct struc_226 { - int8_t field_0[27]; +struct MhdNagenuke { + int16_t mhnu_type; + uint32_t mhnu_lever_dir; }; -struct struc_225 { - float_t field_0[27]; +struct RobTarget { + TargetType target_flag; + float_t target_end; + vec3 target_pos; + + RobTarget(); }; -struct struc_224 { - float_t field_0[27]; +struct MotLeafCtrl { + int16_t mode; + float_t start_frame; + float_t end_frame; + int16_t target_id; + int16_t limit; + vec3 ofs; + vec3 min; + vec3 max; + vec3 field_34; + vec3 field_40; + + MotLeafCtrl(); + MotLeafCtrl(int16_t mode, float_t start_frame, float_t end_frame); }; -struct struc_306 { - int16_t field_0; +struct RobMotData { + uint32_t mot; + float_t frame_max; float_t frame; - float_t field_8; - int16_t field_C; - int16_t field_E; - vec3 field_10; - vec3 field_1C; - vec3 field_28; - int32_t field_34; - int32_t field_38; - int32_t field_3C; - int32_t field_40; - int32_t field_44; - int32_t field_48; - - struc_306(); - struc_306(int16_t field_0, float_t frame, float_t field_8); -}; - -struct struc_652 { - uint32_t motion_id; - float_t frame_count; - float_t frame; - int16_t field_C; - struc_228 field_10; - struc_228 field_20; - struc_228 field_30; - struc_228 field_40; - int16_t field_50; - int16_t field_52; - int16_t field_54; - int32_t field_58; - int32_t field_5C; - int32_t field_60; - int32_t field_64; - int32_t field_68; - int32_t loop_count; + int16_t ex_damage_all; + prj::BitArray motkind_fix; + prj::BitArray motkind; + prj::BitArray old_motkind_fix; + prj::BitArray old_motkind; + uint16_t start_style; + uint16_t end_style; + uint16_t end_style_flag; + MhNextType next_type; + RobMotId next; + RobMotId next_end; + int32_t next_limit; float_t loop_begin; float_t loop_end; - float_t field_78; - float_t field_7C; - float_t field_80; - int8_t field_84; - int32_t field_88; - int32_t field_8C; - int32_t field_90; - int16_t field_94; - int16_t field_96; - int16_t field_98; - int32_t field_9C; - int16_t field_A0; - int32_t field_A4; - int64_t field_A8; - struc_227 field_B0[26]; - int32_t field_1E8; - float_t field_1EC; - float_t field_1F0; - float_t field_1F4; - float_t field_1F8; - float_t field_1FC; - float_t field_200; - int32_t field_204; - int32_t field_208; - int32_t field_20C; - int64_t field_210; - float_t field_218; - float_t field_21C; - int16_t field_220; - std::list field_228; - int16_t field_238; - float_t field_23C; - int32_t field_240; - int16_t field_244; - const mothead_mot_data* field_248; - int64_t field_250; - float_t field_258; - int32_t field_25C; - int64_t field_260; - int64_t field_268; - int32_t field_270; - int16_t field_274; - int16_t field_276; - int32_t field_278; - int32_t field_27C; - int32_t field_280; - int16_t field_284; - int64_t field_288; - int32_t field_290; - int32_t field_294; - int32_t field_298; - float_t field_29C; - int8_t field_2A0; - float_t field_2A4; - float_t field_2A8; - float_t field_2AC; - int64_t field_2B0; - int16_t field_2B8; - int32_t field_2BC; - float_t field_2C0; - float_t field_2C4; - int32_t field_2C8; - int32_t field_2CC; - int64_t field_2D0; - int64_t field_2D8; - int64_t field_2E0; - int16_t field_2E8; - int32_t field_2EC; - int32_t field_2F0; - int32_t field_2F4; - int32_t field_2F8; - int32_t field_2FC; - int8_t field_300; - int32_t field_304; - int32_t field_308; - float_t field_30C; - int32_t field_310; - int16_t field_314; - vec3 field_318; - float_t field_324; - float_t field_328; - int32_t iterations; - - struc_652(); - ~struc_652(); - - void reset(); - - void sub_140536DD0(); -}; - -struct struc_651 { - struc_377 field_0; - int32_t field_10; - int32_t field_14; - int32_t field_18; - float_t field_1C; - vec3 field_20; - struc_226 field_2C[3]; - struc_225 field_80[3]; - struc_224 field_1C4[3]; - int64_t field_308; + float_t main_mot_frame; + float_t follow1_frame; + float_t follow2_frame; + bool attack_flag; + prj::BitArray<7> attack_kind; + AtkUnit attack_unit; + AtkPoint attack_point; + int16_t original_damage; + int16_t attack_damage; + int16_t dist_min_damage; + prj::BitArray<6> dc_type; + RobAngle efc_yang; + MhYarareType yarare_type; + prj::BitArray efc_flag; + MhEfcSpeedType efc_spd; + float_t attack_ball_multi; + float_t down_attack_multi; + RobMotDAs field_B8[25]; + prj::BitArray air_kind; + float_t jump_frame; + float_t stop_frame; + float_t land_frame; + float_t ev_land_frame; + float_t land_ypos; + float_t gravity; + RobMotId nagerare_mot; + RobMotId nagerare_mot_mirror; + float_t nage_ringout_frame; + float_t nage_cancel_frame; + float_t nage_kabe_follow2; + int16_t nage_damage; + std::list nage_nuke_list; + int16_t tag_jumph; + float_t tag_xofs; + float_t tag_zofs; + int16_t shift_num; + MhdList* shift_adr; + float_t ukemi_start_ofs_frame; + float_t ukemi_end_frame; + float_t ukemi_exec_frame; + uint32_t ukemi_flag; + prj::BitArray kaesare_type; + prj::BitArray kaeseru_type; + MhKaeshiAttrib kaesare_attrib; + RobAngle mov_yang; + RobAngle old_mov_yang; + prj::BitArray<3> gacha_flag; + RobMotId gacha_mot; + int16_t gacha_times; + float_t gacha_frame; + MhGuardType guard_type; + prj::BitArray guard_flag; + float_t guard_frame; + uint32_t frame_ctrl_type; + float_t frame_ctrl_frame; + int8_t frame_ctrl_tag_type; + float_t frame_ctrl_tag_add; + float_t frame_ctrl_min; + float_t frame_ctrl_max; + ES_DATA* est_adr; + RobAngle dturn_yang; + prj::BitArray<2> smooth_flag; + float_t smooth_f_length; + float_t smooth_r_length; + float_t ride_on_ypos; + std::vector atk_snd_list; + int16_t kabe_damage; + MhKabeDmgType kabe_damage_type; + prj::BitArray<21> nagereru_char; + prj::BitArray resist_type; + int16_t resist_low_limit; + int16_t resist_max_limit; + int16_t resist_percent; + MhResistDownChkType resist_down_chk; + float_t resist_slow_frame; + float_t resist_slow_step; + MhEnDrinkOffType en_drink_off_type; + int16_t en_drink_off_dec; + float_t trans_xofs; + float_t trans_yofs; + float_t trans_zofs; + float_t jump_zspd; + float_t wall_haritsuki_frame; + int32_t init_cnt; + MhpList* play_prog; + MhpList* play_prog_org; + bool play_prog_x; // X + prj::BitArray<17> revise_flag; + uint32_t rob_cam_flag; + RobTarget target; + bool colliball_flag[3][ROB_COLLI_ID_MAX]; + float_t colliball_ratio[3][ROB_COLLI_ID_MAX]; + float_t colliball_timer[3][ROB_COLLI_ID_MAX]; + prj::BitArray<41> touch_nage_mask; float_t arm_adjust_next_value; // X float_t arm_adjust_prev_value; // X int32_t arm_adjust_start_frame; // X float_t arm_adjust_duration; // X - float_t field_310; - float_t field_314; - int8_t field_318; - int32_t field_31C; - float_t field_320; - float_t field_324; - float_t field_328; - float_t field_32C; - float_t field_330; - float_t field_334; - int8_t field_338; - struc_306 field_33C[4]; + float_t mot_adjust_start; + float_t mot_adjust_end; + uint8_t mot_adjust_flag; + MotAdjustType mot_adjust_type; + float_t mot_adjust_scale; + float_t pre_adjust_scale; + float_t mot_adjust_base_ypos; + float_t pre_adjust_base_ypos; + float_t atk2_start_frame; + float_t atk2_end_frame; + bool atk2_set_flag; + MotLeafCtrl leaf_ctrl[LCPART_MAX]; + MhcList* mh_command; + int32_t mh_did; - struc_651(); + RobMotData(); + ~RobMotData(); - void reset(); + void clear(); + void mhd_pp_clear(); + void mhd_pp_exec(rob_chara* impl, float_t frame, const motion_database* mot_db); + void mhd_smd_atk_clear(); + void mhd_smd_clear(); + void mhd_smd_exec(rob_chara* impl, MhdList* list); }; -struct struc_223 { - struc_652 field_0; - struc_651 field_330; - const int64_t* field_7A0; - uint32_t motion_set_id; - - struc_223(); - ~struc_223(); - - void reset(); -}; - -struct rob_chara_data_miku_rot { +struct RobPosition { RobAngle yang; RobAngle act_yang; RobAngle hara_xang; @@ -3502,12 +4926,12 @@ struct rob_chara_data_miku_rot { vec3 pos_camera_old; mat4 rob_mat; - rob_chara_data_miku_rot(); + RobPosition(); void reset(); }; -struct rob_chara_adjust_data { +struct RobAdjust { float_t scale; bool height_adjust; float_t pos_adjust_y; @@ -3527,21 +4951,29 @@ struct rob_chara_adjust_data { vec3 item_pos; // X float_t item_scale; // X - rob_chara_adjust_data(); + RobAdjust(); void reset(); }; -struct struc_195 { - vec3 prev_pos; - vec3 pos; - float_t scale; - float_t field_1C; - float_t field_20; - float_t field_24; +namespace prj { + struct Sphere3f { + vec3 c; + float_t r; - struc_195(); -}; + Sphere3f(); + }; + + struct BallCollision { + vec3 old_c; + Sphere3f ball; + float_t sink; + int32_t colli_ball_mask; + float_t org_rad; + + BallCollision(); + }; +} struct pos_scale { vec2 pos; @@ -3553,205 +4985,218 @@ struct pos_scale { const vec3& pos, float_t scale = 0.0f, bool apply_offset = false); }; -struct struc_267 { - float_t field_0; - int16_t field_4; - int16_t field_6; - float_t field_8; - int16_t field_C; +struct RobColliWall { + float_t wdist; + RobAngle wang; + float_t wheight; + RobAngle wyang; + + RobColliWall(); + + void setup(); }; -struct struc_209 { - int16_t field_0; - int32_t field_4; - int32_t field_8; - int32_t field_C; - int32_t field_10; - int32_t field_14; - int32_t field_18; - int32_t field_1C; - int32_t field_20; - int32_t field_24; - int32_t field_28; - int32_t field_2C; - int32_t field_30; - int32_t field_34; - int32_t field_38; - int32_t field_3C; - int32_t field_40; - int32_t field_44; - int32_t field_48; - int32_t field_4C; - int32_t field_50; - int32_t field_54; - int32_t field_58; - int32_t field_5C; - int32_t field_60; - float_t field_64; - int32_t field_68; - int32_t field_6C; - int32_t field_70; - int32_t field_74; - mat4 field_78[27]; - mat4 field_738[27]; - struc_195 field_DF8[27]; - struc_195 field_1230[27]; - struc_195 field_1668[27]; - pos_scale field_1AA0[27]; - float_t field_1BE4[27]; +struct RobCollision { + int8_t touch_count; + int8_t wall_touch_cnt; + uint32_t touch_mask; + uint32_t attack_mask; + uint32_t hit_mask; + uint32_t damage_mask; + uint32_t check_wall; + uint32_t wall_hit_num; + uint32_t wall_hit_mask; + uint32_t handrail_hit_num; + uint32_t handrail_hit_mask; + uint32_t dummy_wall_hit_num; + uint32_t dummy_wall_hit_mask; + uint32_t dummy_ringout_num; + uint32_t dummy_ringout_mask; + uint32_t above_floor_num; + uint32_t above_floor_mask; + uint32_t floor_hit_num; + uint32_t floor_hit_mask; + uint32_t ringout_num; + uint32_t ringout_mask; + uint32_t ringout_air_num; + uint32_t ringout_air_mask; + float_t sink_floor; + int32_t floor_idx; + uint32_t fld_on; + float_t sink_wall; + int32_t wall_idx; + vec3 wall_hit_pos; + mat4 mat[ROB_COLLI_ID_MAX]; + mat4 push_mat[ROB_COLLI_ID_MAX]; + prj::BallCollision cb_hit[ROB_COLLI_ID_MAX]; + prj::BallCollision cb_rob[ROB_COLLI_ID_MAX]; + prj::BallCollision cb_stg[ROB_COLLI_ID_MAX]; + pos_scale field_1AA0[ROB_COLLI_ID_MAX]; + float_t field_1BE4[ROB_COLLI_ID_MAX]; prj::vector_pair field_1C50; int64_t field_1C68; int64_t field_1C70; int64_t field_1C78; int64_t field_1C80; - int32_t field_1C88[27]; - int32_t field_1CF4[27]; - int32_t field_1D60[27]; + int32_t field_1C88[ROB_COLLI_ID_MAX]; + int32_t field_1CF4[ROB_COLLI_ID_MAX]; + int32_t field_1D60[ROB_COLLI_ID_MAX]; int32_t field_1DCC; int32_t field_1DD0; int32_t field_1DD4; int32_t field_1DD8; - int32_t field_1DDC; - float_t field_1DE0; - float_t field_1DE4; - int32_t field_1DE8; - int32_t field_1DEC; - float_t field_1DF0; - float_t field_1DF4; - int32_t field_1DF8; - int32_t field_1DFC; - int32_t field_1E00; - int32_t field_1E04; - int32_t field_1E08; - int32_t field_1E0C; - int32_t field_1E10; - int32_t field_1E14; - int32_t field_1E18; - int32_t field_1E1C; - int32_t field_1E20; - int32_t field_1E24; - int32_t field_1E28; - int32_t field_1E2C; - int32_t field_1E30; - int32_t field_1E34; - int32_t field_1E38; - int32_t field_1E3C; - int32_t field_1E40; - int32_t field_1E44; - int32_t field_1E48; - int32_t field_1E4C; - int32_t field_1E50; - int32_t field_1E54; - int32_t field_1E58; - int32_t field_1E5C; - int32_t field_1E60; - int32_t field_1E64; - int32_t field_1E68; - int32_t field_1E6C; - int32_t field_1E70; - int32_t field_1E74; - int32_t field_1E78; - int32_t field_1E7C; - int32_t field_1E80; - int32_t field_1E84; - int32_t field_1E88; - int32_t field_1E8C; - int32_t field_1E90; - int32_t field_1E94; - int32_t field_1E98; - int32_t field_1E9C; - int32_t field_1EA0; - int32_t field_1EA4; - int32_t field_1EA8; - int32_t field_1EAC; - int32_t field_1EB0; - struc_267 field_1EB4[4]; - int32_t field_1EF4[4]; - int8_t field_1F04; - int32_t field_1F08; - int32_t field_1F0C; - int32_t field_1F10; - int32_t field_1F14; - int32_t field_1F18; - int32_t field_1F1C; - int8_t field_1F20; - int8_t field_1F21; - int8_t field_1F22; - int8_t field_1F23; - int8_t field_1F24; - int8_t field_1F25; - int8_t field_1F26; + float_t sink; + float_t max_ypos; + float_t min_ypos; + int32_t max_idx; + int32_t min_idx; + float_t top_ypos; + float_t bot_ypos; + int32_t top_idx; + int32_t bot_idx; + vec3 moveF; + vec3 moveR; + vec3 moveRT; + vec3 moveM; + vec3 moveD; + vec3 moveW[2]; + vec3 moveWd[2]; + vec3 moveWr[2]; + vec3 moveWT[2]; + vec3 moveT[2]; + RobColliWall wall_info[4]; + float_t ringout_dist[4]; + bool init_thrust_vec_req; + vec3 thrust_vec; + vec3 rep_hit_pos; + bool req_wall_break; + bool enable_dummy_collision; + bool fall_ringout; + bool req_kabe_yoroke; + bool calc_rob_colli; + bool colli_attack_hit; + bool floor_ringout_disable; - struc_209(); - ~struc_209(); + RobCollision(); + ~RobCollision(); + + void init(); }; -struct rob_chara_data { +union RobEnInfoFlag { + uint32_t u32; + struct { + int8_t en_from_behind : 1; + int8_t en_from_right : 1; + int8_t en_not_look_me : 1; + int8_t en_down_attack : 1; + int8_t en_down_attack2 : 1; + int8_t en_down_nage : 1; + int8_t en_front : 1; + int8_t en_back : 1; + int8_t en_right : 1; + int8_t en_left : 1; + int8_t en_at_front : 1; + int8_t en_at_back : 1; + int8_t en_at_right : 1; + int8_t en_at_left : 1; + } bit; +}; + +union RobInfoFlag { + uint32_t u32; + struct { + int8_t disp_left : 1; + int8_t calculated_disp_left : 1; + int8_t death : 1; + int8_t disp_left_cmd : 1; + int8_t disp_left_cmd_base : 1; + } bit; +}; + +struct RobInfo { + float_t en_dist; + float_t en_dist_3d; + RobAngle en_dir_yang; + RobAngle en_dir_yang2; + RobAngle revise_en_dir_yang; + RobEnInfoFlag en_flag; + RobEnInfoFlag old_en_flag; + RobInfoFlag flag; + prj::BitArray<41> en_nage_flag; + prj::BitArray<41> en_touch_nage_flag; + float_t profit; + float_t my_profit; + + RobInfo(); + + void init(); +}; + +struct RobRingOut { + bool stop; + bool down; + bool stand; + bool fall; + bool air; + bool air2down; + bool set_fix_hara; + bool replay_ringout; + vec3 ringout_pos; + vec3 ringout_spd; + + RobRingOut(); + + void init(); +}; + +struct RobSound { + bool blow_flag; + + RobSound(); + + void init(); +}; + +class RobBase { +public: RobFlag flag; - struc_264 action; - RobSubAction rob_sub_action; - rob_chara_motion motion; - struc_223 motdata; - rob_chara_data_miku_rot position; - rob_chara_adjust_data adjust_data; - struc_209 field_1E68; - float_t field_3D90; - int32_t field_3D94; - int16_t field_3D98; - int16_t field_3D9A; - int32_t field_3D9C; - int32_t field_3DA0; - uint8_t field_3DA4; - int64_t field_3DA8; - int64_t field_3DB0; - int32_t field_3DB8; - int32_t field_3DBC; - int32_t field_3DC0; - int32_t field_3DC4; - int32_t field_3DC8; - int32_t field_3DCC; - int32_t field_3DD0; - float_t field_3DD4; - int32_t field_3DD8; - float_t field_3DDC; - uint8_t field_3DE0; + RobAction action; + RobSubAction sub_action; + RobMotion robmot; + RobMotData motdata; + RobPosition position; + RobAdjust adjust; + RobCollision collision; + RobInfo robinfo; + RobRingOut ringout; + RobSound sound; float_t arm_adjust_scale; // X - rob_chara_data(); - ~rob_chara_data(); + RobBase(); + ~RobBase(); - void reset(); + void init(); }; -struct struc_307 { - int64_t field_0; - int32_t field_8; - int32_t field_C; - int64_t field_10; - int16_t field_18; - int16_t field_1A; - int16_t field_1C; - int16_t field_1E; - int64_t field_20; - rob_chara_bone_data* field_28; -}; - -struct rob_chara { - int8_t chara_id; - rob_chara_type type; - bool field_C; - bool field_D; +class rob_chara { +public: + int8_t idnm; + RobType type; + int16_t energy; + bool disp_pos_reset; + bool disp_pos_reset_forbidden; CHARA_NUM chara_num; int32_t cos_id; float_t frame_speed; - rob_chara* field_20; + rob_chara* enemy; rob_chara_bone_data* bone_data; - rob_chara_item_equip* rob_disp; - rob_chara_item_cos_data item_cos_data; - rob_chara_data data; - rob_chara_data data_prev; + RobDisp* disp; + RobItem item; + RobBase rob_base; + RobBase rob_base_old; const RobData* rob_data; - rob_chara_pv_data pv_data; + RobInit rob_init; rob_chara(); ~rob_chara(); @@ -3760,47 +5205,55 @@ struct rob_chara { void arm_adjust_ctrl(); void autoblink_disable(); void autoblink_enable(); + void calc_mot_adjust_scale(); + RobAngle calc_mot_yang(bool compel_flag) const; + bool check_disp_left() const; bool check_for_ageageagain_module(); mat4* get_bone_data_mat(size_t index); + uint32_t get_common_mot(MOTTABLE_TYPE mottbl_type) const; + float_t get_frame() const; + float_t get_frame_max() const; + const vec3* get_gpos() const; object_info get_rob_data_face_object(int32_t index); - float_t get_frame(); - float_t get_frame_count(); - float_t get_max_face_depth(); - uint32_t get_rob_cmn_mottbl_motion_id(int32_t id); - float_t get_pos_scale(int32_t bone, vec3& pos); - void load_body_parts_object_info(ROB_PARTS_KIND rpk, object_info obj_info, + float_t get_face_depth() const; + float_t get_pos_scale(ROB_COLLI_ID colli_id, vec3& center); + const RobInit* get_rob_init() const; + void set_item(ROB_PARTS_KIND kind, object_info obj_uid, const bone_database* bone_data, void* data, const object_database* obj_db); - void load_motion(uint32_t motion_id, bool a3, float_t frame, - MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db); - void load_outfit_object_info(ROB_PARTS_KIND rpk, object_info obj_info, - bool osage_reset, const bone_database* bone_data, void* data, const object_database* obj_db); void pos_reset(); void rob_info_ctrl(); void rob_motion_modifier_ctrl(); - void reset_data(const rob_chara_pv_data* pv_data, + bool replace_rob_motion(uint32_t motnum, float_t frame, float_t blend_duration, + bool blend, bool set_motion_reset_data, MotionBlendType blend_type, + const bone_database* bone_data, const motion_database* mot_db); + void req_frame_change(float_t frame); + void reset_rob(const RobInit& robinit, const bone_database* bone_data, const motion_database* mot_db); void reset_osage(); + void reset_osage_pos(); + void set_base(ROB_PARTS_KIND kind, object_info obj_uid, bool osage_reset, + const bone_database* bone_data, void* data, const object_database* obj_db); void set_bone_data_frame(float_t frame); + void set_chara(ROB_ID id, CHARA_NUM cn, int32_t cos_id, const RobInit& ri); void set_chara_color(bool value); void set_chara_height_adjust(bool value); void set_chara_pos_adjust(const vec3& value); void set_chara_pos_adjust_y(float_t value); void set_chara_size(float_t value); - void set_data_adjust_mat(rob_chara_adjust_data* rob_chr_adj, bool pos_adjust = true); - void set_base_position_pos(const vec3& value); - void set_base_position_yang(const RobAngle& value); + void set_data_adjust_mat(RobAdjust* rob_chr_adj, bool pos_adjust = true); void set_disable_collision(rob_osage_parts parts, bool disable); - void set_eyelid_mottbl_motion(int32_t type, int32_t mottbl_index, + void set_disp_flag(bool flag); + void set_eyelid_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); void set_eyelid_mottbl_motion_from_face(int32_t a2, float_t blend_duration, float_t value, float_t blend_offset, const motion_database* mot_db); - void set_eyes_mottbl_motion(int32_t type, int32_t mottbl_index, + void set_eyes_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); - void set_face_mottbl_motion(int32_t type, int32_t mottbl_index, + void set_face_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, bool a11, const motion_database* mot_db); @@ -3810,11 +5263,11 @@ struct rob_chara { void set_hand_item(int32_t uid, float_t blend_duration); void set_hand_item_l(int32_t uid); void set_hand_item_r(int32_t uid); - void set_hand_l_mottbl_motion(int32_t type, int32_t mottbl_index, + void set_hand_l_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); - void set_hand_r_mottbl_motion(int32_t type, int32_t mottbl_index, + void set_hand_r_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); @@ -3825,31 +5278,33 @@ struct rob_chara { float_t eyes_rot_strength, float_t blend_duration, float_t eyes_rot_step, float_t a8); void set_look_camera_old(bool rotation_enable, float_t head_rot_strength, float_t eyes_rot_strength, float_t blend_duration, float_t eyes_rot_step, float_t a8); - bool set_motion_id(uint32_t motion_id, float_t frame, - float_t blend_duration, bool blend, bool set_motion_reset_data, - MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db); void set_motion_loop(float_t loop_begin, float_t loop_end, int32_t loop_count); - void set_motion_reset_data(uint32_t motion_id, float_t frame); - void set_motion_skin_param(uint32_t motion_id, float_t frame); + void set_motion_reset_data(const uint32_t& motnum, const float_t& frame); + void set_motion_skin_param(const uint32_t& motnum, const float_t& frame); void set_motion_step(float_t value); - void set_mouth_mottbl_motion(int32_t type, int32_t mottbl_index, + void set_mouth_mottbl_motion(int32_t type, MOTTABLE_TYPE mottbl_type, float_t value, rob_partial_motion_playback_state playback_state, float_t blend_duration, float_t play_duration, float_t step, rob_partial_motion_loop_state loop_state, float_t blend_offset, const motion_database* mot_db); void set_osage_move_cancel(uint8_t id, float_t mv_ccl); void set_osage_reset(); void set_osage_step(float_t value); - void set_parts_disp(ROB_PARTS_KIND rpk, bool disp); + void set_parts_disp(ROB_PARTS_KIND kind, bool flag); void set_right_hand_scale(float_t value); + void set_rob_motion(uint32_t motnum, bool mirror, float_t frame, + MotionBlendType blend_type, const bone_database* bone_data, const motion_database* mot_db); + void set_rob_motion_external(uint32_t motnum); + void set_rob_pos(const vec3& pos); + void set_rob_sys_command(ACT_NAME name, int32_t motion_id, const ActParam* param, bool mirror); + void set_rob_yang(const RobAngle& ang); void set_shadow_cast(bool value); void set_stage_data_ring(const int32_t& stage_index); void set_step_motion_step(float_t value); void set_use_opd(bool value); - void set_visibility(bool value); void set_wind_strength(float_t value); - inline bool is_visible() { - return !!data.flag.bit.disp; + inline bool get_disp_flag() { + return !!rob_base.flag.bit.disp; } void sub_1405070E0(const bone_database* bone_data, const motion_database* mot_db); @@ -3858,26 +5313,74 @@ struct rob_chara { void sub_140551000(); }; +class RobManagement { +public: + static bool colli_check_on; + static CHARA_NUM chara_num[]; + static int32_t instance_count; + static rob_chara rob_impl[]; + static RobInit rob_init[]; + + RobManagement(); + ~RobManagement(); + + bool check_alive_rob(ROB_ID id); + bool check_disp_left(ROB_ID id); + bool check_ringout_only_rob(ROB_ID id); + bool check_ringout_transit_rob(ROB_ID id); + ROB_ID create_rob(CHARA_NUM cn, const RobInit& ri, int32_t cos_id, bool can_set_default); + void dest_all(); + void dest_rob(ROB_ID id); + float_t get_adjust_scale(ROB_ID id) const; + CHARA_NUM get_chara(ROB_ID id) const; + bool get_colli_check_on() const; + bool get_disp_on(ROB_ID id) const; + const vec3* get_gpos(ROB_ID id) const; + rob_chara* get_rob(ROB_ID id); + const RobData* get_rob_data(ROB_ID id) const; + // RobDetail* get_rob_detail_if(ROB_ID id); + rob_chara_bone_data* get_rob_motion_work(ROB_ID id); + size_t get_rob_num() const; + RobDisp* get_rob_robdisp_work(ROB_ID id); + RobItem* get_rob_robitem_work(ROB_ID id); + const RobInit* get_rob_init(ROB_ID id) const; + bool is_init(ROB_ID id) const; + void reset_osage_pos(ROB_ID id); + void reset_rob(const RobInit& rob0, const RobInit& rob1, + const bone_database* bone_data, const motion_database* mot_db); + void reset_rob(ROB_ID id, const RobInit& ri, + const bone_database* bone_data, const motion_database* mot_db); + void set_colli_check_on(bool value); + void set_disp_on(ROB_ID id, bool value); + void set_mot_frame(ROB_ID id, float_t frame); + void set_motion(ROB_ID id, int32_t motnum); + void set_no_ctrl(ROB_ID id); + void set_rob_pos(ROB_ID id, const vec3& pos); + void set_rob_yang(ROB_ID id, const RobAngle& ang); + + static void init(); +}; + struct pv_data_set_motion { - uint32_t motion_id; + uint32_t motnum; std::pair frame_stage_index; pv_data_set_motion(); - pv_data_set_motion(uint32_t motion_id); - pv_data_set_motion(uint32_t motion_id, std::pair frame_stage_index); + pv_data_set_motion(uint32_t motnum); + pv_data_set_motion(uint32_t motnum, std::pair frame_stage_index); }; struct osage_init_data { rob_chara* rob_chr; int32_t pv_id; - uint32_t motion_id; + uint32_t motnum; std::string dir; int32_t frame; osage_init_data(); - osage_init_data(rob_chara* rob_chr, uint32_t motion_id = -1); + osage_init_data(rob_chara* rob_chr, uint32_t motnum = -1); osage_init_data(rob_chara* rob_chr, int32_t pv_id, - uint32_t motion_id, const std::string& dir = "", int32_t frame = -1); + uint32_t motnum, const std::string& dir = "", int32_t frame = -1); ~osage_init_data(); }; @@ -3945,6 +5448,8 @@ struct OpdChecker { void sub_140471020(); }; +extern RobManagement* get_rob_management(); + extern const RobData* get_rob_data(CHARA_NUM cn); extern int32_t rob_data_get_chara_size_index(CHARA_NUM cn); extern int32_t rob_data_get_swim_costume(CHARA_NUM cn); @@ -3955,8 +5460,6 @@ extern float_t chara_size_table_get_value(uint32_t index); extern bool check_cos_id_is_501(int32_t cos_id); -extern uint32_t get_common_rob_mot(CHARA_NUM cn, int32_t a2, int32_t id); - const char* get_dev_ram_opdi_dir(); extern const float_t get_gravity(); @@ -3985,91 +5488,78 @@ extern void opd_make_start_get_motion_ids(std::vector& motion_ids); extern void opd_make_stop(); extern bool osage_play_data_manager_add_task(); -extern void osage_play_data_manager_append_chara_motion_id(rob_chara* rob_chr, uint32_t motion_id); +extern void osage_play_data_manager_append_chara_motion_id(rob_chara* rob_chr, uint32_t motnum); extern void osage_play_data_manager_append_chara_motion_ids( rob_chara* rob_chr, const std::vector& motion_ids); extern bool osage_play_data_manager_check_task_ready(); extern void osage_play_data_manager_get_opd_file_data(object_info obj_info, - uint32_t motion_id, const float_t*& data, uint32_t& count); + uint32_t motnum, const float_t*& data, uint32_t& count); extern void osage_play_data_manager_reset(); extern void osage_play_database_load(); -extern void pv_osage_manager_array_reset(int32_t chara_id); +extern void pv_osage_manager_array_reset(ROB_ID rob_id); extern void rob_init(); extern void rob_free(); -extern void rob_chara_age_age_array_ctrl(int32_t chara_id, int32_t part_id, mat4& mat); +extern void rob_chara_age_age_array_ctrl(int32_t rob_id, int32_t part, mat4& mat); extern void rob_chara_age_age_array_disp(render_context* rctx, - int32_t chara_id, bool reflect, bool chara_color); -extern void rob_chara_age_age_array_load(int32_t chara_id, int32_t part_id); -extern void rob_chara_age_age_array_reset(int32_t chara_id); -extern void rob_chara_age_age_array_set_alpha(int32_t chara_id, int32_t part_id, float_t alpha); -extern void rob_chara_age_age_array_set_disp(int32_t chara_id, int32_t part_id, bool value); -extern void rob_chara_age_age_array_set_move_cancel(int32_t chara_id, int32_t part_id, float_t value); -extern void rob_chara_age_age_array_set_npr(int32_t chara_id, int32_t part_id, bool value); -extern void rob_chara_age_age_array_set_params(int32_t chara_id, int32_t part_id, + int32_t rob_id, bool reflect, bool chara_color); +extern void rob_chara_age_age_array_load(int32_t rob_id, int32_t part); +extern void rob_chara_age_age_array_reset(int32_t rob_id); +extern void rob_chara_age_age_array_set_alpha(int32_t rob_id, int32_t part, float_t alpha); +extern void rob_chara_age_age_array_set_disp(int32_t rob_id, int32_t part, bool value); +extern void rob_chara_age_age_array_set_move_cancel(int32_t rob_id, int32_t part, float_t value); +extern void rob_chara_age_age_array_set_npr(int32_t rob_id, int32_t part, bool value); +extern void rob_chara_age_age_array_set_params(int32_t rob_id, int32_t part, int32_t npr, int32_t speed, int32_t skip, int32_t disp); -extern void rob_chara_age_age_array_set_speed(int32_t chara_id, int32_t part_id, float_t value); -extern void rob_chara_age_age_array_set_skip(int32_t chara_id, int32_t part_id); -extern void rob_chara_age_age_array_set_step(int32_t chara_id, int32_t part_id, float_t step); -extern void rob_chara_age_age_array_set_step_full(int32_t chara_id, int32_t part_id); +extern void rob_chara_age_age_array_set_speed(int32_t rob_id, int32_t part, float_t value); +extern void rob_chara_age_age_array_set_skip(int32_t rob_id, int32_t part); +extern void rob_chara_age_age_array_set_step(int32_t rob_id, int32_t part, float_t step); +extern void rob_chara_age_age_array_set_step_full(int32_t rob_id, int32_t part); -extern bool rob_chara_array_check_visibility(int32_t chara_id); -extern rob_chara* rob_chara_array_get(int32_t chara_id); -extern rob_chara_bone_data* rob_chara_array_get_bone_data(int32_t chara_id); -extern float_t rob_chara_array_get_data_adjust_scale(int32_t chara_id); -extern rob_chara_item_cos_data* rob_chara_array_get_item_cos_data(int32_t chara_id); -extern rob_chara_item_equip* rob_chara_array_get_rob_disp(int32_t chara_id); -extern int32_t rob_chara_array_init_chara_num(CHARA_NUM chara_num, - const rob_chara_pv_data& pv_data, int32_t cos_id, bool can_set_default); -extern void rob_chara_array_free_chara_id(int32_t chara_id); -extern void rob_chara_array_reset_pv_data(int32_t chara_id); -extern void rob_chara_array_reset_bone_data_item_equip(int32_t chara_id); -extern void rob_chara_array_set_alpha_obj_flags(int32_t chara_id, float_t alpha, mdl::ObjFlags flags); -extern void rob_chara_array_set_visibility(int32_t chara_id, bool value); +extern void rob_chara_array_reset_pv_data(ROB_ID id); +extern void rob_chara_array_reset_bone_data_item_equip(ROB_ID id); +extern void rob_chara_array_set_alpha_obj_flags(ROB_ID id, float_t alpha, mdl::ObjFlags flags); -extern bool rob_chara_check_for_ageageagain_module(CHARA_NUM chara_num, int32_t cos_id); - -extern bool rob_chara_pv_data_array_check_chara_id(int32_t chara_id); +extern bool rob_chara_check_for_ageageagain_module(CHARA_NUM cn, int32_t cos_id); extern void rob_sleeve_handler_data_get_sleeve_data( - CHARA_NUM chara_num, int32_t cos, rob_sleeve_data& l, rob_sleeve_data& r); + CHARA_NUM cn, int32_t cos, rob_sleeve_data& l, rob_sleeve_data& r); extern bool rob_sleeve_handler_data_load(); extern void rob_sleeve_handler_data_read(); extern bool pv_osage_manager_array_get_disp(); -extern bool pv_osage_manager_array_get_disp(int32_t chara_id); +extern bool pv_osage_manager_array_get_disp(ROB_ID rob_id); extern void pv_osage_manager_array_set_motion_ids( - int32_t chara_id, const std::vector& motion_ids); + ROB_ID rob_id, const std::vector& motion_ids); extern void pv_osage_manager_array_set_not_reset_true(); -extern void pv_osage_manager_array_set_pv_id(int32_t chara_id, int32_t pv_id, bool reset); +extern void pv_osage_manager_array_set_pv_id(ROB_ID rob_id, int32_t pv_id, bool reset); extern void pv_osage_manager_array_set_pv_set_motion( - int32_t chara_id, const std::vector& set_motion); + ROB_ID rob_id, const std::vector& set_motion); extern bool task_rob_load_add_task(); -extern bool task_rob_load_append_free_req_data(CHARA_NUM chara_num); -extern bool task_rob_load_append_free_req_data_obj(CHARA_NUM chara_num, const item_cos_data* cos); -extern bool task_rob_load_append_load_req_data(CHARA_NUM chara_num); -extern bool task_rob_load_append_load_req_data_obj(CHARA_NUM chara_num, const item_cos_data* cos); +extern bool task_rob_load_append_free_req_data(CHARA_NUM cn); +extern bool task_rob_load_append_free_req_data_obj(CHARA_NUM cn, const RobItemEquip* equip); +extern bool task_rob_load_append_load_req_data(CHARA_NUM cn); +extern bool task_rob_load_append_load_req_data_obj(CHARA_NUM cn, const RobItemEquip* equip); extern bool task_rob_load_check_load_req_data(); extern bool task_rob_load_del_task(); extern bool task_rob_manager_add_task(); -extern bool task_rob_manager_check_chara_loaded(int32_t chara_id); +extern bool task_rob_manager_check_chara_loaded(ROB_ID rob_id); extern bool task_rob_manager_check_task_ready(); -extern void task_rob_manager_free_all_chara(); extern bool task_rob_manager_get_free_chara_list_empty(); -extern bool task_rob_manager_get_wait(int32_t chara_id); +extern bool task_rob_manager_get_wait(ROB_ID rob_id); extern bool task_rob_manager_hide_task(); extern bool task_rob_manager_run_task(); extern bool task_rob_manager_del_task(); -extern int32_t expression_id_to_mottbl_index(int32_t expression_id); -extern int32_t hand_anim_id_to_mottbl_index(int32_t hand_anim_id); -extern int32_t look_anim_id_to_mottbl_index(int32_t look_anim_id); -extern int32_t mouth_anim_id_to_mottbl_index(int32_t mouth_anim_id); +extern MOTTABLE_TYPE expression_id_to_mottbl_type(int32_t id); +extern MOTTABLE_TYPE hand_anim_id_to_mottbl_type(int32_t id); +extern MOTTABLE_TYPE look_anim_id_to_mottbl_type(int32_t id); +extern MOTTABLE_TYPE mouth_anim_id_to_mottbl_type(int32_t id); inline bool rob_chara::check_for_ageageagain_module() { return rob_chara_check_for_ageageagain_module(chara_num, cos_id); diff --git a/src/CRE/rob/skin_param.cpp b/src/CRE/rob/skin_param.cpp index 98394187..b78899b5 100644 --- a/src/CRE/rob/skin_param.cpp +++ b/src/CRE/rob/skin_param.cpp @@ -19,7 +19,7 @@ struct osage_setting { void clear(); const osage_setting_osg_cat* get_cat_value( - const object_info& obj_info, const char* root_node); + const object_info& obj_uid, const char* root_node); void load(); void parse(key_val* kv); rob_osage_parts parse_parts_string(std::string& s); @@ -37,36 +37,36 @@ struct skin_param_file { }; struct skin_param_key { - object_info obj_info; - uint32_t motion_id; + object_info obj_uid; + uint32_t motnum; int32_t frame; inline skin_param_key() { - motion_id = -1; + motnum = -1; frame = -1; } - inline skin_param_key(object_info obj_info) { - this->obj_info = obj_info; - motion_id = -1; + inline skin_param_key(object_info obj_uid) { + this->obj_uid = obj_uid; + motnum = -1; frame = -1; } - inline skin_param_key(object_info obj_info, uint32_t motion_id) { - this->obj_info = obj_info; - this->motion_id = motion_id; + inline skin_param_key(object_info obj_uid, uint32_t motnum) { + this->obj_uid = obj_uid; + this->motnum = motnum; frame = -1; } - inline skin_param_key(object_info obj_info, uint32_t motion_id, int32_t frame) { - this->obj_info = obj_info; - this->motion_id = motion_id; + inline skin_param_key(object_info obj_uid, uint32_t motnum, int32_t frame) { + this->obj_uid = obj_uid; + this->motnum = motnum; this->frame = frame; } }; constexpr bool operator==(const skin_param_key& left, const skin_param_key& right) { - return left.obj_info == right.obj_info && left.motion_id == right.motion_id && left.frame == right.frame; + return left.obj_uid == right.obj_uid && left.motnum == right.motnum && left.frame == right.frame; } constexpr bool operator!=(const skin_param_key& left, const skin_param_key& right) { @@ -74,10 +74,10 @@ constexpr bool operator!=(const skin_param_key& left, const skin_param_key& righ } constexpr bool operator<(const skin_param_key& left, const skin_param_key& right) { - if (left.obj_info != right.obj_info) - return left.obj_info < right.obj_info; - else if (left.motion_id != right.motion_id) - return left.motion_id < right.motion_id; + if (left.obj_uid != right.obj_uid) + return left.obj_uid < right.obj_uid; + else if (left.motnum != right.motnum) + return left.motnum < right.motnum; else if (left.frame != right.frame) return left.frame < right.frame; else @@ -120,7 +120,7 @@ struct SkinParamManager : public app::Task { int32_t GetExtSkpFile(const osage_init_data& osage_init, const std::string& dir, std::string& file, void* data, const motion_database* mot_db); std::vector* GetSkinParamFileData( - object_info obj_info, uint32_t motion_id, int32_t frame); + object_info obj_uid, uint32_t motnum, int32_t frame); void Reset(); }; @@ -138,7 +138,7 @@ struct sp_skp_db { void parse(key_val* kv); int32_t get_ext_skp_file(const osage_init_data& osage_init, - const object_info obj_info, std::string& file, std::string& farc, + const object_info obj_uid, std::string& file, std::string& farc, void* data, const motion_database* mot_db); }; @@ -236,8 +236,8 @@ osage_setting_osg_cat::osage_setting_osg_cat() : exf() { } const osage_setting_osg_cat* osage_setting_data_get_cat_value( - const object_info& obj_info, const char* root_node) { - return osage_setting_data->get_cat_value(obj_info, root_node); + const object_info& obj_uid, const char* root_node) { + return osage_setting_data->get_cat_value(obj_uid, root_node); } bool osage_setting_data_obj_has_key(object_info key) { @@ -303,8 +303,8 @@ int32_t skin_param_manager_get_ext_skp_file( } std::vector* skin_param_manager_get_skin_param_file_data( - int32_t chara_id, object_info obj_info, uint32_t motion_id, int32_t frame) { - return skin_param_manager_get(chara_id)->GetSkinParamFileData(obj_info, motion_id, frame); + int32_t chara_id, object_info obj_uid, uint32_t motnum, int32_t frame) { + return skin_param_manager_get(chara_id)->GetSkinParamFileData(obj_uid, motnum, frame); } void skin_param_manager_reset(int32_t chara_id) { @@ -572,8 +572,8 @@ void skin_param_osage_root_parse(void* kv, const char* name, _kv->close_scope(); } -key_val* skin_param_storage_get_key_val(object_info obj_info) { - auto elem = skin_param_storage.find(obj_info); +key_val* skin_param_storage_get_key_val(object_info obj_uid) { + auto elem = skin_param_storage.find(obj_uid); if (elem != skin_param_storage.end()) return elem->second.get(); return 0; @@ -618,8 +618,8 @@ void osage_setting::clear() { } const osage_setting_osg_cat* osage_setting::get_cat_value( - const object_info& obj_info, const char* root_node) { - auto elem_obj = osage_setting_data->obj.find(obj_info); + const object_info& obj_uid, const char* root_node) { + auto elem_obj = osage_setting_data->obj.find(obj_uid); if (elem_obj == osage_setting_data->obj.end()) return 0; @@ -781,17 +781,17 @@ void SkinParamManager::AddFiles() { files.clear(); for (osage_init_data& i : osage_init) { - rob_chara_item_equip* rob_disp = i.rob_chr->rob_disp; + RobDisp* rob_disp = i.rob_chr->disp; for (int32_t j = RPK_ITEM_BEGIN; j <= RPK_ITEM_END; j++) { - object_info obj_info = rob_disp->get_object_info((ROB_PARTS_KIND)j); - if (obj_info.is_null()) + object_info obj_uid = rob_disp->get_objid((ROB_PARTS_KIND)j); + if (obj_uid.is_null()) continue; - const char* obj_name = objset_info_storage_get_obj_name(obj_info); + const char* obj_name = objset_info_storage_get_obj_name(obj_uid); if (!obj_name) continue; - obj_skin_ex_data* ex_data = objset_info_storage_get_obj_skin_ex_data(obj_info); + obj_skin_ex_data* ex_data = objset_info_storage_get_obj_skin_ex_data(obj_uid); if (!ex_data) continue; @@ -837,7 +837,7 @@ void SkinParamManager::AddFiles() { bool read_farc = false; if (skp_file->type == -1) { skp_file->type = sp_skp_db_data->get_ext_skp_file(i, - obj_info, file, farc_file, aft_data, aft_mot_db); + obj_uid, file, farc_file, aft_data, aft_mot_db); if (skp_file->type == -1) { delete skp_file; continue; @@ -854,7 +854,7 @@ void SkinParamManager::AddFiles() { std::vector* skp_file_data = 0; switch (skp_file->type) { case 0: { - skin_param_key key(obj_info, i.motion_id, i.frame); + skin_param_key key(obj_uid, i.motnum, i.frame); auto elem = object_motion_frame.find(key); if (elem != object_motion_frame.end()) { delete skp_file; @@ -865,7 +865,7 @@ void SkinParamManager::AddFiles() { object_motion_frame.insert({ key, skp_file_data }); } break; case 1: { - skin_param_key key(obj_info, i.motion_id); + skin_param_key key(obj_uid, i.motnum); auto elem = object_motion.find(key); if (elem != object_motion.end()) { delete skp_file; @@ -876,7 +876,7 @@ void SkinParamManager::AddFiles() { object_motion.insert({ key, skp_file_data }); } break; case 2: { - skin_param_key key(obj_info); + skin_param_key key(obj_uid); auto elem = object.find(key); if (elem != object.end()) { delete skp_file; @@ -922,18 +922,18 @@ bool SkinParamManager::CtrlFiles() { continue; } - rob_chara_item_equip* rob_disp = skp_file->rob_chr->rob_disp; + RobDisp* rob_disp = skp_file->rob_chr->disp; key_val kv; kv.parse(skp_file->file_handler->get_data(), skp_file->file_handler->get_size()); - object_info obj_info = rob_disp->get_object_info(skp_file->rpk); - if (!obj_info.not_null()) { + object_info obj_uid = rob_disp->get_objid(skp_file->rpk); + if (!obj_uid.not_null()) { i = files.erase(i); continue; } - rob_chara_item_equip_object* skin_disp = &rob_disp->skin_disp[skp_file->rpk]; + RobSkinDisp* skin_disp = &rob_disp->skin_disp[skp_file->rpk]; skin_param_file_data* skp_file_data = skp_file->data->data(); for (ExNodeBlock* j : skin_disp->ex_node_block) { @@ -966,8 +966,8 @@ int32_t SkinParamManager::GetExtSkpFile(const osage_init_data& osage_init, std::string buf1; std::string buf2; - if (osage_init.motion_id != -1) { - const char* motion_name = mot_db->get_motion_name(osage_init.motion_id); + if (osage_init.motnum != -1) { + const char* motion_name = mot_db->get_motion_name(osage_init.motnum); if (!motion_name) return -1; @@ -1008,25 +1008,25 @@ int32_t SkinParamManager::GetExtSkpFile(const osage_init_data& osage_init, } std::vector* SkinParamManager::GetSkinParamFileData( - object_info obj_info, uint32_t motion_id, int32_t frame) { + object_info obj_uid, uint32_t motnum, int32_t frame) { if (object_motion_frame.size()) { - auto elem_frame = object_motion_frame.find({ obj_info, motion_id, frame }); + auto elem_frame = object_motion_frame.find({ obj_uid, motnum, frame }); if (elem_frame != object_motion_frame.end()) return elem_frame->second; - auto elem = object_motion_frame.find({ obj_info, motion_id }); + auto elem = object_motion_frame.find({ obj_uid, motnum }); if (elem != object_motion_frame.end()) return elem->second; } if (object_motion.size()) { - auto elem = object_motion.find({ obj_info, motion_id }); + auto elem = object_motion.find({ obj_uid, motnum }); if (elem != object_motion.end()) return elem->second; } if (object.size()) { - auto elem = object.find({ obj_info }); + auto elem = object.find({ obj_uid }); if (elem != object.end()) return elem->second; } @@ -1199,9 +1199,9 @@ void sp_skp_db::parse(key_val* kv) { } int32_t sp_skp_db::get_ext_skp_file(const osage_init_data& osage_init, - const object_info obj_info, std::string& file, std::string& farc, + const object_info obj_uid, std::string& file, std::string& farc, void* data, const motion_database* mot_db) { - if (obj_info.is_null()) + if (obj_uid.is_null()) return 2; int32_t type = 2; @@ -1209,7 +1209,7 @@ int32_t sp_skp_db::get_ext_skp_file(const osage_init_data& osage_init, if (osage_init.pv_id > -1) { auto elem0 = pv.find(osage_init.pv_id); if (elem0 != pv.end()) { - auto elem1 = elem0->second->find(obj_info); + auto elem1 = elem0->second->find(obj_uid); if (elem1 != elem0->second->end()) { type = 1; farc.assign(farc_list[elem1->second]); @@ -1217,8 +1217,8 @@ int32_t sp_skp_db::get_ext_skp_file(const osage_init_data& osage_init, } } - if (osage_init.motion_id != -1) { - const char* motion_name = mot_db->get_motion_name(osage_init.motion_id); + if (osage_init.motnum != -1) { + const char* motion_name = mot_db->get_motion_name(osage_init.motnum); if (motion_name) { std::string buf(motion_name); if (osage_init.frame > -1) @@ -1226,7 +1226,7 @@ int32_t sp_skp_db::get_ext_skp_file(const osage_init_data& osage_init, auto elem0 = motion.find(buf); if (elem0 != motion.end()) { - auto elem1 = elem0->second->find(obj_info); + auto elem1 = elem0->second->find(obj_uid); if (elem1 != elem0->second->end()) { type = 0; farc.assign(farc_list[elem1->second]); @@ -1235,12 +1235,12 @@ int32_t sp_skp_db::get_ext_skp_file(const osage_init_data& osage_init, } } - const char* obj_name = objset_info_storage_get_obj_name(obj_info); + const char* obj_name = objset_info_storage_get_obj_name(obj_uid); std::string skp_file = sprintf_s_string("ext_skp_%s.txt", obj_name); switch (type) { case 0: { - std::string motion_name(mot_db->get_motion_name(osage_init.motion_id)); + std::string motion_name(mot_db->get_motion_name(osage_init.motnum)); if (osage_init.frame > -1) motion_name = sprintf_s_string("%s_%d", motion_name.c_str(), osage_init.frame); diff --git a/src/CRE/rob/skin_param.hpp b/src/CRE/rob/skin_param.hpp index 28fec877..3410b97a 100644 --- a/src/CRE/rob/skin_param.hpp +++ b/src/CRE/rob/skin_param.hpp @@ -9,7 +9,7 @@ #include "../../KKdLib/key_val.hpp" extern const osage_setting_osg_cat* osage_setting_data_get_cat_value( - const object_info& obj_info, const char* root_node); + const object_info& obj_uid, const char* root_node); extern bool osage_setting_data_obj_has_key(object_info key); extern void skin_param_data_init(); @@ -24,7 +24,7 @@ extern int32_t skin_param_manager_get_ext_skp_file( int32_t chara_id, const osage_init_data& osage_init, const std::string& dir, std::string& file, void* data, const motion_database* mot_db); extern std::vector* skin_param_manager_get_skin_param_file_data( - int32_t chara_id, object_info obj_info, uint32_t motion_id, int32_t frame); + int32_t chara_id, object_info obj_uid, uint32_t motion_id, int32_t frame); extern void skin_param_manager_reset(int32_t chara_id); extern void skin_param_osage_node_parse(void* kv, const char* name, @@ -33,7 +33,7 @@ extern void skin_param_osage_node_parse(void* kv, const char* name, extern void skin_param_osage_root_parse(void* kv, const char* name, skin_param_osage_root& skp_root, const bone_database* bone_data); -extern key_val* skin_param_storage_get_key_val(object_info obj_info); +extern key_val* skin_param_storage_get_key_val(object_info obj_uid); extern void skin_param_storage_load(std::vector& obj_infos, void* data, const object_database* obj_db); extern void skin_param_storage_reset(); diff --git a/src/CRE/sss.cpp b/src/CRE/sss.cpp index d1f10992..8391bd17 100644 --- a/src/CRE/sss.cpp +++ b/src/CRE/sss.cpp @@ -122,6 +122,7 @@ void sss_data::pre_proc(const struct cam_data& cam) { vec3 interest = rctx->camera->interest; vec3 view_point = rctx->camera->view_point; + RobManagement* rob_man = get_rob_management(); vec3 chara_position[2]; chara_position[0] = 0.0f; chara_position[1] = 0.0f; @@ -129,8 +130,8 @@ void sss_data::pre_proc(const struct cam_data& cam) { for (int32_t i = 0; i < 2; i++) { chara_position[i] = interest; chara_distance[i] = 999999.0f; - rob_chara_bone_data* rob_bone_data = rob_chara_array_get_bone_data(i); - if (rob_chara_pv_data_array_check_chara_id(i) && rob_chara_array_check_visibility(i)) { + rob_chara_bone_data* rob_bone_data = rob_man->get_rob_motion_work((ROB_ID)i); + if (rob_man->is_init((ROB_ID)i) && rob_man->get_disp_on((ROB_ID)i)) { mat4* mat = rob_bone_data->get_mats_mat(BLK_N_HARA_CP); if (mat) { mat4_get_translation(mat, &chara_position[i]); diff --git a/src/CRE/stage.cpp b/src/CRE/stage.cpp index ffb321ad..5d56ba6b 100644 --- a/src/CRE/stage.cpp +++ b/src/CRE/stage.cpp @@ -803,7 +803,7 @@ static void stage_set(stage* s, stage* other) { if (!pv_osage_manager_array_get_disp() && other) for (int32_t i = 0; i < ROB_ID_MAX; i++) { - rob_chara* rob_chr = rob_chara_array_get(i); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); if (rob_chr) rob_chr->set_stage_data_ring(other->index); } diff --git a/src/CRE/stage_modern.cpp b/src/CRE/stage_modern.cpp index 0b4f87ba..25d0e008 100644 --- a/src/CRE/stage_modern.cpp +++ b/src/CRE/stage_modern.cpp @@ -686,9 +686,9 @@ static void stage_modern_set(stage_modern* s, stage_modern* other) { if (pv_osage_manager_array_get_disp() && other) for (int32_t i = 0; i < ROB_ID_MAX; i++) { - rob_chara* rob_chr = rob_chara_array_get(i); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); //if (rob_chr) - //rob_chara_set_stage_data_ring(rob_chr, &other->index); + //rob_chr->set_stage_data_ring(other->index); } } diff --git a/src/CRE/task.cpp b/src/CRE/task.cpp index 9f3ec218..24e7262f 100644 --- a/src/CRE/task.cpp +++ b/src/CRE/task.cpp @@ -129,21 +129,29 @@ namespace app { } void Task::set_name(const char* name) { - if (!name) { - this->name[0] = 0; - return; - } - - size_t len = utf8_length(name); - len = min_def(len, sizeof(this->name) - 1); - memmove(&this->name, name, len); - this->name[len] = 0; + set_name_sub(this->name, name, -1); } void Task::set_priority(int32_t priority) { this->priority = priority; } + void Task::set_name_sub(char dst[0x20], const char* src, size_t size) { + if (dst == src) + return; + + if (size) { + const char* end = (const char*)memchr(src, 0, size); + if (end) + size = end - src; + } + + size = min_def(size, sizeof(dst) - 1); + if (size) + memcpy_s(dst, 0x20, src, size); + memset(&dst[size], 0, size < 0x20); + } + TaskWork::TaskWork() : current_task(), disp_task() { } diff --git a/src/CRE/task.hpp b/src/CRE/task.hpp index ff02ab4c..2fd10f57 100644 --- a/src/CRE/task.hpp +++ b/src/CRE/task.hpp @@ -80,6 +80,9 @@ namespace app { void set_name(const char* name); void set_priority(int32_t priority); + + private: + static void set_name_sub(char dst[0x20], const char* src, size_t size); }; struct TaskWork { diff --git a/src/CRE/texture.cpp b/src/CRE/texture.cpp index 2636a517..c75d7be9 100644 --- a/src/CRE/texture.cpp +++ b/src/CRE/texture.cpp @@ -74,8 +74,8 @@ texture* texture_alloc(texture_id id) { } void texture_apply_color_tone(const texture* chg_tex, - const texture* org_tex, const color_tone* col_tone) { - if (!chg_tex || !org_tex || !col_tone + const texture* org_tex, const ImgfColorToneParam* color) { + if (!chg_tex || !org_tex || !color || chg_tex->internal_format != org_tex->internal_format || chg_tex->width != org_tex->width || chg_tex->height != org_tex->height @@ -95,9 +95,9 @@ void texture_apply_color_tone(const texture* chg_tex, texture_bind(org_tex->target, org_tex->glid); glGetCompressedTexImage(org_tex->target, i, data); if (org_tex->internal_format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) - dxt1_image_apply_color_tone(width_align, height_align, size, (dxt1_block*)data, col_tone); + dxt1_image_apply_color_tone(width_align, height_align, size, (dxt1_block*)data, color); else - dxt5_image_apply_color_tone(width_align, height_align, size, (dxt5_block*)data, col_tone); + dxt5_image_apply_color_tone(width_align, height_align, size, (dxt5_block*)data, color); texture_bind(chg_tex->target, chg_tex->glid); int32_t width = org_tex->get_width_mip_level(i); @@ -111,7 +111,7 @@ void texture_apply_color_tone(const texture* chg_tex, texture_bind(org_tex->target, org_tex->glid); glGetTexImage(org_tex->target, i, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); - rgb565_image_apply_color_tone(width_align, height_align, size, (rgb565*)data, col_tone); + rgb565_image_apply_color_tone(width_align, height_align, size, (rgb565*)data, color); texture_bind(chg_tex->target, chg_tex->glid); int32_t width = org_tex->get_width_mip_level(i); @@ -164,8 +164,8 @@ texture* texture_create_copy_texture(texture_id id, texture* org_tex) { } texture* texture_create_copy_texture_apply_color_tone( - texture_id id, texture* org_tex, const color_tone* col_tone) { - if (!org_tex || !col_tone || org_tex->target != GL_TEXTURE_2D) + texture_id id, texture* org_tex, const ImgfColorToneParam* color) { + if (!org_tex || !color || org_tex->target != GL_TEXTURE_2D) return 0; GLenum format = GL_ZERO; @@ -190,16 +190,16 @@ texture* texture_create_copy_texture_apply_color_tone( glGetCompressedTexImage(org_tex->target, i, data); if (org_tex->internal_format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) - dxt1_image_apply_color_tone(width_align, height_align, size, (dxt1_block*)data, col_tone); + dxt1_image_apply_color_tone(width_align, height_align, size, (dxt1_block*)data, color); else - dxt5_image_apply_color_tone(width_align, height_align, size, (dxt5_block*)data, col_tone); + dxt5_image_apply_color_tone(width_align, height_align, size, (dxt5_block*)data, color); } else if (org_tex->internal_format == GL_RGB5) { int32_t width_align = org_tex->get_width_align_mip_level(i); int32_t height_align = org_tex->get_height_align_mip_level(i); glGetTexImage(org_tex->target, i, format, type, data); - rgb565_image_apply_color_tone(width_align, height_align, size, (rgb565*)data, col_tone); + rgb565_image_apply_color_tone(width_align, height_align, size, (rgb565*)data, color); } else glGetTexImage(org_tex->target, i, format, type, data); diff --git a/src/CRE/texture.hpp b/src/CRE/texture.hpp index 6be27f29..ad8a62f9 100644 --- a/src/CRE/texture.hpp +++ b/src/CRE/texture.hpp @@ -101,10 +101,10 @@ struct texture_manager { extern texture* texture_alloc(texture_id id); extern void texture_apply_color_tone(const texture* chg_tex, - const texture* org_tex, const color_tone* col_tone); + const texture* org_tex, const ImgfColorToneParam* color); extern texture* texture_create_copy_texture(texture_id id, texture* org_tex); extern texture* texture_create_copy_texture_apply_color_tone( - texture_id id, texture* org_tex, const color_tone* col_tone); + texture_id id, texture* org_tex, const ImgfColorToneParam* color); extern texture* texture_load_tex_2d(texture_id id, GLenum internal_format, int32_t width, int32_t height, int32_t max_mipmap_level, const void** data_ptr, bool use_high_anisotropy); extern texture* texture_load_tex_cube_map(texture_id id, GLenum internal_format, int32_t width, int32_t height, diff --git a/src/KKdLib/database/bone.cpp b/src/KKdLib/database/bone.cpp index 3ab96c1d..b59f1a74 100644 --- a/src/KKdLib/database/bone.cpp +++ b/src/KKdLib/database/bone.cpp @@ -293,7 +293,7 @@ int32_t bone_database::get_block_index(const char* kind_name, const char* name) return -1; } -const std::vector* bone_database::get_body_type(const char* kind_name) const { +const std::vector* bone_database::get_body_type_table(const char* kind_name) const { if (!kind_name) return 0; @@ -303,7 +303,7 @@ const std::vector* bone_database::get_body_type(const char* kind_name) return 0; } -const std::vector* bone_database::get_chain_pos_rad(const char* kind_name) const { +const std::vector* bone_database::get_joint_table(const char* kind_name) const { if (!kind_name) return 0; @@ -327,7 +327,7 @@ int32_t bone_database::get_bone_index(const char* kind_name, const char* name) c return -1; } -const std::vector* bone_database::get_bone_name(const char* kind_name) const { +const std::vector* bone_database::get_bone_name_table(const char* kind_name) const { if (!kind_name) return 0; @@ -351,7 +351,7 @@ int32_t bone_database::get_bone_node_index(const char* kind_name, const char* na return -1; } -const std::vector* bone_database::get_bone_node_name(const char* kind_name) const { +const std::vector* bone_database::get_bone_node_name_table(const char* kind_name) const { if (!kind_name) return 0; @@ -361,7 +361,7 @@ const std::vector* bone_database::get_bone_node_name(const char* ki return 0; } -const std::vector* bone_database::get_parent_node(const char* kind_name) const { +const std::vector* bone_database::get_node_parent_table(const char* kind_name) const { if (!kind_name) return 0; @@ -397,35 +397,34 @@ bool bone_database::load_file(void* data, const char* dir, const char* file, uin return bone_data->ready; } -void bone_database_bones_calculate_count(const std::vector* bones, - size_t& bone_name_num, size_t& bone_node_num, - size_t& node_count, size_t& leaf_pos, size_t& chain_pos) { - bone_name_num = 0; - bone_node_num = 0; - node_count = 0; - leaf_pos = 0; - chain_pos = 0; +void bone_database_bones_calculate_count(const std::vector* body_type_table, + size_t& mat_max, size_t& block_max, size_t& node_max, size_t& leaf_pos_max, size_t& chain_pos_max) { + mat_max = 0; + block_max = 0; + node_max = 0; + leaf_pos_max = 0; + chain_pos_max = 0; - for (const BODYTYPE& i : *bones) { - bone_name_num++; - node_count++; + for (const BODYTYPE& i : *body_type_table) { + mat_max++; + node_max++; if (i.ik_type >= IKT_2) - bone_name_num += 2; - chain_pos++; + mat_max += 2; + chain_pos_max++; if (i.ik_type >= IKT_1) { - chain_pos++; - node_count += 2; + chain_pos_max++; + node_max += 2; if (i.ik_type >= IKT_2) { - chain_pos++; - node_count++; + chain_pos_max++; + node_max++; } } if (i.ik_type >= IKT_ROOT) - leaf_pos++; - bone_node_num++; + leaf_pos_max++; + block_max++; } } diff --git a/src/KKdLib/database/bone.hpp b/src/KKdLib/database/bone.hpp index 5feee2b9..9f667936 100644 --- a/src/KKdLib/database/bone.hpp +++ b/src/KKdLib/database/bone.hpp @@ -34,13 +34,13 @@ enum IH_TYPE { }; enum IK_TYPE { - IKT_0 = 0x00, - IKT_0N = 0x01, - IKT_0T = 0x02, - IKT_ROOT = 0x03, - IKT_1 = 0x04, - IKT_2 = 0x05, - IKT_2R = 0x06, + IKT_0 = 0x00, // Rotation + IKT_0N = 0x01, // Normal(?) + IKT_0T = 0x02, // Translation + IKT_ROOT = 0x03, // Rotation + Translation + IKT_1 = 0x04, // Rotation + IK with 1 Segment + IKT_2 = 0x05, // Rotation + IK with 2 Segment + IKT_2R = 0x06, // Rotation + IK with 2 Segment (Reverse) }; struct CHAINPOSRADIUS { @@ -100,32 +100,32 @@ struct bone_database { const BoneData* get_bone_data(const char* kind_name) const; int32_t get_block_index(const char* kind_name, const char* name) const; - const std::vector* get_body_type(const char* kind_name) const; - const std::vector* get_chain_pos_rad(const char* kind_name) const; + const std::vector* get_body_type_table(const char* kind_name) const; + const std::vector* get_joint_table(const char* kind_name) const; int32_t get_bone_index(const char* kind_name, const char* name) const; - const std::vector* get_bone_name(const char* kind_name) const; + const std::vector* get_bone_name_table(const char* kind_name) const; int32_t get_bone_node_index(const char* kind_name, const char* name) const; - const std::vector* get_bone_node_name(const char* kind_name) const; - const std::vector* get_parent_node(const char* kind_name) const; + const std::vector* get_bone_node_name_table(const char* kind_name) const; + const std::vector* get_node_parent_table(const char* kind_name) const; const float_t* get_heel_height(const char* kind_name) const; static bool load_file(void* data, const char* dir, const char* file, uint32_t hash); const BoneData* get_bone_data(BONE_KIND kind) const; int32_t get_block_index(BONE_KIND kind, const char* name) const; - const std::vector* get_body_type(BONE_KIND kind) const; - const std::vector* get_chain_pos_rad(BONE_KIND kind) const; + const std::vector* get_body_type_table(BONE_KIND kind) const; + const std::vector* get_joint_table(BONE_KIND kind) const; int32_t get_bone_index(BONE_KIND kind, const char* name) const; - const std::vector* get_bone_name(BONE_KIND kind) const; + const std::vector* get_bone_name_table(BONE_KIND kind) const; int32_t get_bone_node_index(BONE_KIND kind, const char* name) const; - const std::vector* get_bone_node_name(BONE_KIND kind) const; - const std::vector* get_parent_node(BONE_KIND kind) const; + const std::vector* get_bone_node_name_table(BONE_KIND kind) const; + const std::vector* get_node_parent_table(BONE_KIND kind) const; const float_t* get_heel_height(BONE_KIND kind) const; }; -extern void bone_database_bones_calculate_count(const std::vector* bones, - size_t& object_bone_count, size_t& motion_bone_count, - size_t& node_count, size_t& leaf_pos, size_t& chain_pos); +extern void bone_database_bones_calculate_count(const std::vector* body_type_table, + size_t& mat_max, size_t& block_max, + size_t& node_max, size_t& leaf_pos_max, size_t& chain_pos_max); extern const char* bone_database_skeleton_type_to_string(BONE_KIND kind); @@ -137,32 +137,32 @@ inline int32_t bone_database::get_block_index(BONE_KIND kind, const char* name) return get_block_index(bone_database_skeleton_type_to_string(kind), name); } -inline const std::vector* bone_database::get_body_type(BONE_KIND kind) const { - return get_body_type(bone_database_skeleton_type_to_string(kind)); +inline const std::vector* bone_database::get_body_type_table(BONE_KIND kind) const { + return get_body_type_table(bone_database_skeleton_type_to_string(kind)); } -inline const std::vector* bone_database::get_chain_pos_rad(BONE_KIND kind) const { - return get_chain_pos_rad(bone_database_skeleton_type_to_string(kind)); +inline const std::vector* bone_database::get_joint_table(BONE_KIND kind) const { + return get_joint_table(bone_database_skeleton_type_to_string(kind)); } inline int32_t bone_database::get_bone_index(BONE_KIND kind, const char* name) const { return get_bone_index(bone_database_skeleton_type_to_string(kind), name); } -inline const std::vector* bone_database::get_bone_name(BONE_KIND kind) const { - return get_bone_name(bone_database_skeleton_type_to_string(kind)); +inline const std::vector* bone_database::get_bone_name_table(BONE_KIND kind) const { + return get_bone_name_table(bone_database_skeleton_type_to_string(kind)); } inline int32_t bone_database::get_bone_node_index(BONE_KIND kind, const char* name) const { return get_bone_node_index(bone_database_skeleton_type_to_string(kind), name); } -inline const std::vector* bone_database::get_bone_node_name(BONE_KIND kind) const { - return get_bone_node_name(bone_database_skeleton_type_to_string(kind)); +inline const std::vector* bone_database::get_bone_node_name_table(BONE_KIND kind) const { + return get_bone_node_name_table(bone_database_skeleton_type_to_string(kind)); } -inline const std::vector* bone_database::get_parent_node(BONE_KIND kind) const { - return get_parent_node(bone_database_skeleton_type_to_string(kind)); +inline const std::vector* bone_database::get_node_parent_table(BONE_KIND kind) const { + return get_node_parent_table(bone_database_skeleton_type_to_string(kind)); } inline const float_t* bone_database::get_heel_height(BONE_KIND kind) const { diff --git a/src/KKdLib/database/item_table.cpp b/src/KKdLib/database/item_table.cpp index b00d5835..114399e0 100644 --- a/src/KKdLib/database/item_table.cpp +++ b/src/KKdLib/database/item_table.cpp @@ -108,7 +108,7 @@ itm_table_item_data_obj::~itm_table_item_data_obj() { } -itm_table_item_data_ofs::itm_table_item_data_ofs() : sub_id(), no() { +itm_table_item_data_ofs::itm_table_item_data_ofs() : sub_id(), item_no() { } @@ -120,7 +120,7 @@ itm_table_item_data_tex::~itm_table_item_data_tex() { } -itm_table_item_data_col::itm_table_item_data_col() : flag(), col_tone() { +itm_table_item_data_col::itm_table_item_data_col() : flag(), color() { } @@ -136,8 +136,8 @@ itm_table_item_data::~itm_table_item_data() { } -itm_table_item::itm_table_item() : no(), flag(), type(), attr(), des_id(), -sub_id(), exclusion(), point(), org_itm(), npr_flag(), face_depth() { +itm_table_item::itm_table_item() : no(), flag(), type(), attr(), equip_des_id(), +equip_sub_id(), exclusion(), point(), org_itm(), npr_flag(), face_depth() { } @@ -324,8 +324,8 @@ const char* item_id_get_name(ROB_PARTS_KIND rpk) { return 0; } -const char* item_sub_id_get_name(item_sub_id sub_id) { - if (sub_id >= 0 && sub_id < ITEM_SUB_MAX) +const char* item_sub_id_get_name(ROB_ITEM_EQUIP_SUB_ID sub_id) { + if (sub_id >= 0 && sub_id < ROB_ITEM_EQUIP_SUB_ID_MAX) return rob_item_equip_sub_id_str[sub_id]; return 0; } @@ -434,7 +434,7 @@ static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size) { continue; } - if (!kv.read("flag", itm.flag) + if (!kv.read("flag", itm.flag.w) || !kv.read("name", itm.name)) { kv.close_scope(); continue; @@ -455,15 +455,19 @@ static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size) { kv.close_scope(); } + int32_t type = 0; + int32_t des_id = 0; int32_t sub_id = 0; - if (!kv.read("type", itm.type) + if (!kv.read("type", type) || !kv.read("attr", itm.attr) - || !kv.read("des_id", itm.des_id) + || !kv.read("des_id", des_id) || !kv.read("sub_id", sub_id)) { kv.close_scope(); continue; } - itm.sub_id = (item_sub_id)sub_id; + itm.type = (ROB_ITEM_TYPE)type; + itm.equip_des_id = (ROB_ITEM_EQUIP_DES_ID)des_id; + itm.equip_sub_id = (ROB_ITEM_EQUIP_SUB_ID)sub_id; if (kv.open_scope("data")) { int32_t count; @@ -497,18 +501,18 @@ static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size) { itm_table_item_data_ofs ofs; int32_t sub_id = 0; - if (kv.read("no", ofs.no) + if (kv.read("no", ofs.item_no) && kv.read("sub_id", sub_id) - && kv.read("tx", ofs.position.x) - && kv.read("ty", ofs.position.y) - && kv.read("tz", ofs.position.z) - && kv.read("rx", ofs.rotation.x) - && kv.read("ry", ofs.rotation.y) - && kv.read("rz", ofs.rotation.z) + && kv.read("tx", ofs.trans.x) + && kv.read("ty", ofs.trans.y) + && kv.read("tz", ofs.trans.z) + && kv.read("rx", ofs.rot.x) + && kv.read("ry", ofs.rot.y) + && kv.read("rz", ofs.rot.z) && kv.read("sx", ofs.scale.x) && kv.read("sy", ofs.scale.y) && kv.read("sz", ofs.scale.z)) { - ofs.sub_id = (item_sub_id)sub_id; + ofs.sub_id = (ROB_ITEM_EQUIP_SUB_ID)sub_id; vido.push_back(ofs); } @@ -545,25 +549,25 @@ static void itm_table_read_text(itm_table* itm_tbl, void* data, size_t size) { itm_table_item_data_col col; kv.read("tex", col.tex); - kv.read("flag", col.flag); + kv.read("flag", col.flag.w); - if (!(col.flag & 0x01)) { + if (!col.flag.m.is_available) { vidc.push_back(col); kv.close_scope(); continue; } - kv.read("blend.0", col.col_tone.blend.x); - kv.read("blend.1", col.col_tone.blend.y); - kv.read("blend.2", col.col_tone.blend.z); - kv.read("offset.0", col.col_tone.offset.x); - kv.read("offset.1", col.col_tone.offset.y); - kv.read("offset.2", col.col_tone.offset.z); - kv.read("hue", col.col_tone.hue); - kv.read("saturation", col.col_tone.saturation); - kv.read("value", col.col_tone.value); - kv.read("contrast", col.col_tone.contrast); - kv.read("inverse", col.col_tone.inverse); + kv.read("blend.0", col.color.blend_color.x); + kv.read("blend.1", col.color.blend_color.y); + kv.read("blend.2", col.color.blend_color.z); + kv.read("offset.0", col.color.offset_color.x); + kv.read("offset.1", col.color.offset_color.y); + kv.read("offset.2", col.color.offset_color.z); + kv.read("hue", col.color.hue); + kv.read("saturation", col.color.saturation); + kv.read("value", col.color.value); + kv.read("contrast", col.color.contrast); + kv.read("inverse", col.color.inverse); vidc.push_back(col); kv.close_scope(); @@ -705,28 +709,28 @@ static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size) kv.open_scope_fmt(sort_index_data[j]); itm_table_item_data_col* col = &vidc[sort_index_data[j]]; - if (col->flag & 0x01) { - kv.write(s, "blend.0", col->col_tone.blend.x); - kv.write(s, "blend.1", col->col_tone.blend.y); - kv.write(s, "blend.2", col->col_tone.blend.z); - kv.write(s, "contrast", col->col_tone.contrast); + if (col->flag.m.is_available) { + kv.write(s, "blend.0", col->color.blend_color.x); + kv.write(s, "blend.1", col->color.blend_color.y); + kv.write(s, "blend.2", col->color.blend_color.z); + kv.write(s, "contrast", col->color.contrast); } - kv.write(s, "flag", col->flag); + kv.write(s, "flag", col->flag.w); - if (col->flag & 0x01) { - kv.write(s, "hue", col->col_tone.hue); - kv.write(s, "inverse", col->col_tone.inverse ? 1 : 0); - kv.write(s, "offset.0", col->col_tone.offset.x); - kv.write(s, "offset.1", col->col_tone.offset.y); - kv.write(s, "offset.2", col->col_tone.offset.z); - kv.write(s, "saturation", col->col_tone.saturation); + if (col->flag.m.is_available) { + kv.write(s, "hue", col->color.hue); + kv.write(s, "inverse", col->color.inverse ? 1 : 0); + kv.write(s, "offset.0", col->color.offset_color.x); + kv.write(s, "offset.1", col->color.offset_color.y); + kv.write(s, "offset.2", col->color.offset_color.z); + kv.write(s, "saturation", col->color.saturation); } kv.write(s, "tex", col->tex); - if (col->flag & 0x01) - kv.write(s, "value", col->col_tone.value); + if (col->flag.m.is_available) + kv.write(s, "value", col->color.value); kv.close_scope(); } @@ -771,17 +775,17 @@ static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size) kv.open_scope_fmt(sort_index_data[j]); itm_table_item_data_ofs* ofs = &vido[sort_index_data[j]]; - kv.write(s, "no", ofs->no); - kv.write(s, "rx", ofs->rotation.x); - kv.write(s, "ry", ofs->rotation.y); - kv.write(s, "rz", ofs->rotation.z); + kv.write(s, "no", ofs->item_no); + kv.write(s, "rx", ofs->rot.x); + kv.write(s, "ry", ofs->rot.y); + kv.write(s, "rz", ofs->rot.z); kv.write(s, "sub_id", ofs->sub_id); kv.write(s, "sx", ofs->scale.x); kv.write(s, "sy", ofs->scale.y); kv.write(s, "sz", ofs->scale.z); - kv.write(s, "tx", ofs->position.x); - kv.write(s, "ty", ofs->position.y); - kv.write(s, "tz", ofs->position.z); + kv.write(s, "tx", ofs->trans.x); + kv.write(s, "ty", ofs->trans.y); + kv.write(s, "tz", ofs->trans.z); kv.close_scope(); } @@ -816,10 +820,10 @@ static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size) kv.close_scope(); } - kv.write(s, "des_id", itm->des_id); + kv.write(s, "des_id", itm->equip_des_id); kv.write(s, "exclusion", itm->exclusion); kv.write(s, "face_depth", itm->face_depth); - kv.write(s, "flag", itm->flag); + kv.write(s, "flag", itm->flag.w); kv.write(s, "name", itm->name); kv.write(s, "no", itm->no); kv.write(s, "npr_flag", itm->npr_flag); @@ -845,7 +849,7 @@ static void itm_table_write_text(itm_table* itm_tbl, void** data, size_t* size) kv.write(s, "org_itm", itm->org_itm); kv.write(s, "point", itm->point); - kv.write(s, "sub_id", itm->sub_id); + kv.write(s, "sub_id", itm->equip_sub_id); kv.write(s, "type", itm->type); kv.close_scope(); diff --git a/src/KKdLib/database/item_table.hpp b/src/KKdLib/database/item_table.hpp index f3a1b76b..c00d9fa6 100644 --- a/src/KKdLib/database/item_table.hpp +++ b/src/KKdLib/database/item_table.hpp @@ -15,53 +15,136 @@ enum CHARA_NUM { CN_NONE = -1, - CN_MIKU = 0x00, - CN_RIN = 0x01, - CN_LEN = 0x02, - CN_LUKA = 0x03, - CN_NERU = 0x04, - CN_HAKU = 0x05, - CN_KAITO = 0x06, - CN_MEIKO = 0x07, - CN_SAKINE = 0x08, - CN_TETO = 0x09, - CN_MAX = 0x0A, + + CN_MIKU = 0, + CN_RIN, + CN_LEN, + CN_LUKA, + CN_NERU, + CN_HAKU, + CN_KAITO, + CN_MEIKO, + CN_SAKINE, + CN_TETO, + CN_MAX, +}; + +enum ROB_ITEM_ATTR { + ROB_ITEM_ATTR_NONE = 0, + + ROB_ITEM_ATTR_OBJ = 0x00000001, + ROB_ITEM_ATTR_OFS = 0x00000002, + ROB_ITEM_ATTR_TEX = 0x00000004, + ROB_ITEM_ATTR_COL = 0x00000008, + ROB_ITEM_ATTR_HYOUTAN = 0x00000010, + ROB_ITEM_ATTR_NUDE = 0x00000020, + ROB_ITEM_ATTR_HADA = 0x00000040, + ROB_ITEM_ATTR_NO_SDW = 0x00000080, + ROB_ITEM_ATTR_NO_REF = 0x00000100, + ROB_ITEM_ATTR_SYM = 0x00000200, + ROB_ITEM_ATTR_NO_MRG = 0x00000400, + ROB_ITEM_ATTR_HEAD = 0x00000800, + ROB_ITEM_ATTR_MAX = 0x80000000, +}; + +enum ROB_ITEM_EQUIP_DES_ID { + ROB_ITEM_EQUIP_DES_ID_NONE = -1, + + ROB_ITEM_EQUIP_DES_ID_ATAM = 0, + ROB_ITEM_EQUIP_DES_ID_FACE, + ROB_ITEM_EQUIP_DES_ID_JOHA, + ROB_ITEM_EQUIP_DES_ID_KAHA, + ROB_ITEM_EQUIP_DES_ID_HADA, + ROB_ITEM_EQUIP_DES_ID_MAX, +}; + +enum ROB_ITEM_EQUIP_ID { + ROB_ITEM_EQUIP_ID_NONE = -1, + + ROB_ITEM_EQUIP_ID_ATAM = 0, + ROB_ITEM_EQUIP_ID_KAO, + ROB_ITEM_EQUIP_ID_JOHA, + ROB_ITEM_EQUIP_ID_UDE, + ROB_ITEM_EQUIP_ID_KAHA, + ROB_ITEM_EQUIP_ID_MAX, +}; + +enum ROB_ITEM_EQUIP_SUB_ID { + ROB_ITEM_EQUIP_SUB_ID_NONE = -1, + + ROB_ITEM_EQUIP_SUB_ID_ZUJO = 0, + ROB_ITEM_EQUIP_SUB_ID_KAMI, + ROB_ITEM_EQUIP_SUB_ID_HITAI, + ROB_ITEM_EQUIP_SUB_ID_ME, + ROB_ITEM_EQUIP_SUB_ID_MEGANE, + ROB_ITEM_EQUIP_SUB_ID_MIMI, + ROB_ITEM_EQUIP_SUB_ID_KUCHI, + ROB_ITEM_EQUIP_SUB_ID_MAKI, + ROB_ITEM_EQUIP_SUB_ID_KUBI, + ROB_ITEM_EQUIP_SUB_ID_INNER, + ROB_ITEM_EQUIP_SUB_ID_OUTER, + ROB_ITEM_EQUIP_SUB_ID_KATA, + ROB_ITEM_EQUIP_SUB_ID_U_UDE, + ROB_ITEM_EQUIP_SUB_ID_L_UDE, + ROB_ITEM_EQUIP_SUB_ID_TE, + ROB_ITEM_EQUIP_SUB_ID_JOHA_MAE, + ROB_ITEM_EQUIP_SUB_ID_JOHA_USHIRO, + ROB_ITEM_EQUIP_SUB_ID_BELT, + ROB_ITEM_EQUIP_SUB_ID_KOSI, + ROB_ITEM_EQUIP_SUB_ID_PANTS, + ROB_ITEM_EQUIP_SUB_ID_ASI, + ROB_ITEM_EQUIP_SUB_ID_SUNE, + ROB_ITEM_EQUIP_SUB_ID_KUTSU, + ROB_ITEM_EQUIP_SUB_ID_HADA, + ROB_ITEM_EQUIP_SUB_ID_HEAD, + ROB_ITEM_EQUIP_SUB_ID_MAX, +}; + +enum ROB_ITEM_TYPE { + ROB_ITEM_TYPE_NONE = -1, + + ROB_ITEM_TYPE_EQUIP = 0, + ROB_ITEM_TYPE_REPLACE, + ROB_ITEM_TYPE_LOOKS, + ROB_ITEM_TYPE_REM, + ROB_ITEM_TYPE_MAX, }; enum ROB_PARTS_KIND { - RPK_NONE = -1, - RPK_BODY = 0x00, - RPK_ATAMA = 0x01, - RPK_KATA_R = 0x02, - RPK_MUNE = 0x03, - RPK_KATA_L = 0x04, - RPK_UDE_R = 0x05, - RPK_SENAKA = 0x06, - RPK_UDE_L = 0x07, - RPK_HARA = 0x08, - RPK_KOSI = 0x09, - RPK_TE_R = 0x0A, - RPK_TE_L = 0x0B, - RPK_MOMO = 0x0C, - RPK_SUNE = 0x0D, - RPK_ASI = 0x0E, - RPK_ITEM01 = 0x0F, - RPK_ITEM02 = 0x10, - RPK_ITEM03 = 0x11, - RPK_ITEM04 = 0x12, - RPK_ITEM05 = 0x13, - RPK_ITEM06 = 0x14, - RPK_ITEM07 = 0x15, - RPK_ITEM08 = 0x16, - RPK_ITEM09 = 0x17, - RPK_ITEM10 = 0x18, - RPK_ITEM11 = 0x19, - RPK_ITEM12 = 0x1A, - RPK_ITEM13 = 0x1B, - RPK_ITEM14 = 0x1C, - RPK_ITEM15 = 0x1D, - RPK_ITEM16 = 0x1E, - RPK_MAX = 0x1F, + RPK_NONE = -1, + + RPK_BODY = 0, + RPK_ATAMA, + RPK_KATA_R, + RPK_MUNE, + RPK_KATA_L, + RPK_UDE_R, + RPK_SENAKA, + RPK_UDE_L, + RPK_HARA, + RPK_KOSI, + RPK_TE_R, + RPK_TE_L, + RPK_MOMO, + RPK_SUNE, + RPK_ASI, + RPK_ITEM01, + RPK_ITEM02, + RPK_ITEM03, + RPK_ITEM04, + RPK_ITEM05, + RPK_ITEM06, + RPK_ITEM07, + RPK_ITEM08, + RPK_ITEM09, + RPK_ITEM10, + RPK_ITEM11, + RPK_ITEM12, + RPK_ITEM13, + RPK_ITEM14, + RPK_ITEM15, + RPK_ITEM16, + RPK_MAX, RPK_TOP = RPK_BODY, @@ -93,36 +176,13 @@ enum ROB_PARTS_KIND { RPK_KUBI = RPK_ITEM06, RPK_JOHA_USHIRO = RPK_ITEM07, RPK_KUCHI = RPK_ITEM08, -}; -enum item_sub_id { - ITEM_SUB_NONE = -1, - ITEM_SUB_ZUJO = 0x00, - ITEM_SUB_KAMI = 0x01, - ITEM_SUB_HITAI = 0x02, - ITEM_SUB_ME = 0x03, - ITEM_SUB_MEGANE = 0x04, - ITEM_SUB_MIMI = 0x05, - ITEM_SUB_KUCHI = 0x06, - ITEM_SUB_MAKI = 0x07, - ITEM_SUB_KUBI = 0x08, - ITEM_SUB_INNER = 0x09, - ITEM_SUB_OUTER = 0x0A, - ITEM_SUB_KATA = 0x0B, - ITEM_SUB_U_UDE = 0x0C, - ITEM_SUB_L_UDE = 0x0D, - ITEM_SUB_TE = 0x0E, - ITEM_SUB_JOHA_MAE = 0x0F, - ITEM_SUB_JOHA_USHIRO = 0x10, - ITEM_SUB_BELT = 0x11, - ITEM_SUB_KOSI = 0x12, - ITEM_SUB_PANTS = 0x13, - ITEM_SUB_ASI = 0x14, - ITEM_SUB_SUNE = 0x15, - ITEM_SUB_KUTSU = 0x16, - ITEM_SUB_HADA = 0x17, - ITEM_SUB_HEAD = 0x18, - ITEM_SUB_MAX = 0x19, + RPK_SP_UDE_L = 100, + RPK_SP_TE_L = 101, + RPK_SP_UDE_R = 102, + RPK_SP_TE_R = 103, + RPK_SP_SUNE = 104, + RPK_SP_ASI = 105, }; struct itm_table_item_data_obj { @@ -134,10 +194,10 @@ struct itm_table_item_data_obj { }; struct itm_table_item_data_ofs { - item_sub_id sub_id; - int32_t no; - vec3 position; - vec3 rotation; + ROB_ITEM_EQUIP_SUB_ID sub_id; + uint32_t item_no; + vec3 trans; + vec3 rot; vec3 scale; itm_table_item_data_ofs(); @@ -151,10 +211,20 @@ struct itm_table_item_data_tex { ~itm_table_item_data_tex(); }; +struct itm_table_item_data_col_flag_member { + uint32_t is_available : 1; + uint32_t reserve : 31; +}; + +union itm_table_item_data_col_flag { + uint32_t w; + itm_table_item_data_col_flag_member m; +}; + struct itm_table_item_data_col { std::string tex; - int32_t flag; - color_tone col_tone; + itm_table_item_data_col_flag flag; + ImgfColorToneParam color; itm_table_item_data_col(); ~itm_table_item_data_col(); @@ -170,19 +240,32 @@ struct itm_table_item_data { ~itm_table_item_data(); }; +struct itm_table_item_flag_member { + uint32_t is_dummy : 1; + uint32_t is_present : 1; + uint32_t is_texorg : 1; + uint32_t is_objorg : 1; + uint32_t reserve : 28; +}; + +union itm_table_item_flag { + uint32_t w; + itm_table_item_flag_member m; +}; + struct itm_table_item { - int32_t no; - int32_t flag; + uint32_t no; + itm_table_item_flag flag; std::string name; std::vector objset; - int32_t type; - int32_t attr; - int32_t des_id; - item_sub_id sub_id; + ROB_ITEM_TYPE type; + uint32_t attr; + ROB_ITEM_EQUIP_DES_ID equip_des_id; + ROB_ITEM_EQUIP_SUB_ID equip_sub_id; itm_table_item_data data; - int32_t exclusion; - int32_t point; - int32_t org_itm; + uint32_t exclusion; + uint32_t point; + uint32_t org_itm; bool npr_flag; float_t face_depth; @@ -236,4 +319,4 @@ extern const char* get_chara_name_full(CHARA_NUM cname); extern CHARA_NUM get_chara_num_from_char_id(const char* in_name); extern const char* item_id_get_name(ROB_PARTS_KIND rpk); -extern const char* item_sub_id_get_name(item_sub_id sub_id); +extern const char* item_sub_id_get_name(ROB_ITEM_EQUIP_SUB_ID sub_id); diff --git a/src/KKdLib/image.cpp b/src/KKdLib/image.cpp index ca3ac870..ed9be82c 100644 --- a/src/KKdLib/image.cpp +++ b/src/KKdLib/image.cpp @@ -5,14 +5,14 @@ #include "image.hpp" -static rgb565 rgb565_apply_color_tone(rgb565 col, const color_tone* col_tone); +static rgb565 rgb565_apply_color_tone(rgb565 col, const ImgfColorToneParam* color); static void rgb_to_ycc(vec3& rgb, vec3& ycc); -static void ycc_apply_col_tone_hue(vec3& ycc, const color_tone* col_tone); +static void ycc_apply_col_tone_hue(vec3& ycc, const ImgfColorToneParam* color); static void ycc_to_rgb(vec3& ycc, vec3& rgb); -color_tone::color_tone() : reserved() { - blend = 1.0f; - offset = 0.0f; +ImgfColorToneParam::ImgfColorToneParam() : reserved() { + blend_color = 1.0f; + offset_color = 0.0f; hue = 0.0f; saturation = 1.0f; value = 0.0f; @@ -21,13 +21,13 @@ color_tone::color_tone() : reserved() { } void dxt1_image_apply_color_tone(int32_t width, int32_t height, - int32_t size, dxt1_block* data, const color_tone* col_tone) { + int32_t size, dxt1_block* data, const ImgfColorToneParam* color) { if (size <= 0) return; for (size_t i = (size - 1ULL) / sizeof(dxt1_block) + 1; i; i--, data++) { - data->color0 = rgb565_apply_color_tone(data->color0, col_tone); - data->color1 = rgb565_apply_color_tone(data->color1, col_tone); + data->color0 = rgb565_apply_color_tone(data->color0, color); + data->color1 = rgb565_apply_color_tone(data->color1, color); if (*(uint16_t*)&data->color0 <= *(uint16_t*)&data->color1) { data->indices[0] &= ~((data->indices[0] >> 1) & 0x5555); data->indices[1] &= ~((data->indices[1] >> 1) & 0x5555); @@ -36,13 +36,13 @@ void dxt1_image_apply_color_tone(int32_t width, int32_t height, } void dxt5_image_apply_color_tone(int32_t width, int32_t height, - int32_t size, dxt5_block* data, const color_tone* col_tone) { + int32_t size, dxt5_block* data, const ImgfColorToneParam* color) { if (size <= 0) return; for (size_t i = (size - 1ULL) / sizeof(dxt5_block) + 1; i; i--, data++) { - data->color0 = rgb565_apply_color_tone(data->color0, col_tone); - data->color1 = rgb565_apply_color_tone(data->color1, col_tone); + data->color0 = rgb565_apply_color_tone(data->color0, color); + data->color1 = rgb565_apply_color_tone(data->color1, color); if (*(uint16_t*)&data->color0 <= *(uint16_t*)&data->color1) { data->color_indices[0] &= ~((data->color_indices[0] >> 1) & 0x5555); data->color_indices[1] &= ~((data->color_indices[1] >> 1) & 0x5555); @@ -51,12 +51,12 @@ void dxt5_image_apply_color_tone(int32_t width, int32_t height, } void rgb565_image_apply_color_tone(int32_t width, int32_t height, - int32_t size, rgb565* data, const color_tone* col_tone) { + int32_t size, rgb565* data, const ImgfColorToneParam* color) { for (size_t i = (size - 1ULL) / sizeof(uint16_t) + 1; i; i--, data++) - *data = rgb565_apply_color_tone(*data, col_tone); + *data = rgb565_apply_color_tone(*data, color); } -static rgb565 rgb565_apply_color_tone(rgb565 col, const color_tone* col_tone) { +static rgb565 rgb565_apply_color_tone(rgb565 col, const ImgfColorToneParam* color) { const vec3 scale = { (float_t)((1 << 5) - 1), (float_t)((1 << 6) - 1), @@ -70,7 +70,7 @@ static rgb565 rgb565_apply_color_tone(rgb565 col, const color_tone* col_tone) { }; vec3 rgb; - if (col_tone->inverse) { + if (color->inverse) { rgb.x = (float_t)((1 << 5) - 1 - col.r); rgb.y = (float_t)((1 << 6) - 1 - col.g); rgb.z = (float_t)((1 << 5) - 1 - col.b); @@ -81,16 +81,16 @@ static rgb565 rgb565_apply_color_tone(rgb565 col, const color_tone* col_tone) { rgb.z = (float_t)col.b; } - rgb = vec3::clamp(rgb * inv_scale * col_tone->blend + col_tone->offset, 0.0f, 1.0f); + rgb = vec3::clamp(rgb * inv_scale * color->blend_color + color->offset_color, 0.0f, 1.0f); vec3 ycc; rgb_to_ycc(rgb, ycc); - *(vec2*)&ycc.y = *(vec2*)&ycc.y * col_tone->saturation; + *(vec2*)&ycc.y = *(vec2*)&ycc.y * color->saturation; - ycc_apply_col_tone_hue(ycc, col_tone); + ycc_apply_col_tone_hue(ycc, color); - ycc.x = (ycc.x + col_tone->value - 0.5f) * col_tone->contrast + 0.5f; + ycc.x = (ycc.x + color->value - 0.5f) * color->contrast + 0.5f; ycc = vec3::clamp(ycc, vec3(0.0f, -0.5f, -0.5f), vec3(1.0f, 0.5f, 0.5f)); @@ -114,8 +114,8 @@ inline static void rgb_to_ycc(vec3& rgb, vec3& ycc) { ycc.z = vec3::dot(rgb, _cr_coef_601); } -inline static void ycc_apply_col_tone_hue(vec3& ycc, const color_tone* col_tone) { - float_t hue = col_tone->hue * DEG_TO_RAD_FLOAT; +inline static void ycc_apply_col_tone_hue(vec3& ycc, const ImgfColorToneParam* color) { + float_t hue = color->hue * DEG_TO_RAD_FLOAT; float_t cos = cosf(hue); float_t sin = sinf(hue); float_t y = ycc.y; diff --git a/src/KKdLib/image.hpp b/src/KKdLib/image.hpp index a6c52027..fcbf1229 100644 --- a/src/KKdLib/image.hpp +++ b/src/KKdLib/image.hpp @@ -8,17 +8,17 @@ #include "default.hpp" #include "vec.hpp" -struct color_tone { - vec3 blend; - vec3 offset; +struct ImgfColorToneParam { + vec3 blend_color; + vec3 offset_color; float_t hue; float_t saturation; float_t value; float_t contrast; bool inverse; - int32_t reserved[8]; + uint32_t reserved[8]; - color_tone(); + ImgfColorToneParam(); }; struct rgb565 { @@ -43,8 +43,8 @@ struct dxt5_block { }; extern void dxt1_image_apply_color_tone(int32_t width, int32_t height, - int32_t size, dxt1_block* data, const color_tone* col_tone); + int32_t size, dxt1_block* data, const ImgfColorToneParam* color); extern void dxt5_image_apply_color_tone(int32_t width, int32_t height, - int32_t size, dxt5_block* data, const color_tone* col_tone); + int32_t size, dxt5_block* data, const ImgfColorToneParam* color); extern void rgb565_image_apply_color_tone(int32_t width, int32_t height, - int32_t size, rgb565* data, const color_tone* col_tone); + int32_t size, rgb565* data, const ImgfColorToneParam* color); diff --git a/src/KKdLib/mot.cpp b/src/KKdLib/mot.cpp index 7ea9c01f..2c546049 100644 --- a/src/KKdLib/mot.cpp +++ b/src/KKdLib/mot.cpp @@ -50,7 +50,7 @@ mot_key_set_data::mot_key_set_data() : type(), frames(), values(), keys_count(), } -mot_data::mot_data() : info(), frame_count(), bone_info_count(), murmurhash(), +mot_data::mot_data() : info(), frame_max(), bone_info_count(), murmurhash(), div_frames(), div_count(), name(), bone_info_array(), key_set_array() { } @@ -631,7 +631,7 @@ static void mot_classic_read_inner(mot_set* ms, prj::shared_ptrinfo = s.read_uint16_t(); - m->frame_count = s.read_uint16_t(); + m->frame_max = s.read_uint16_t(); uint32_t key_set_count = m->key_set_count; mot_key_set_data* key_set_array = alloc->allocate(key_set_count); @@ -698,7 +698,7 @@ static void mot_classic_write_inner(mot_set* ms, stream& s) { mh[i].key_set_info_offset = (uint32_t)s.get_position(); s.write_uint16_t(m->info); - s.write_uint16_t(m->frame_count); + s.write_uint16_t(m->frame_max); uint16_t key_set_count = m->key_set_count; mot_key_set_data* key_set_array = m->key_set_array; @@ -843,7 +843,7 @@ static void mot_modern_read_inner(mot_set* ms, prj::shared_ptrinfo = s_motc.read_uint16_t_reverse_endianness(); - m->frame_count = s_motc.read_uint16_t_reverse_endianness(); + m->frame_max = s_motc.read_uint16_t_reverse_endianness(); uint32_t key_set_count = m->key_set_count; mot_key_set_data* key_set_array = alloc->allocate(key_set_count); @@ -1061,7 +1061,7 @@ static void mot_modern_write_inner(mot_set* ms, stream& s) { mh.key_set_info_offset = s_motc.get_position(); s_motc.write_uint16_t_reverse_endianness(m->info); - s_motc.write_uint16_t_reverse_endianness(m->frame_count); + s_motc.write_uint16_t_reverse_endianness(m->frame_max); mh.key_set_types_offset = s_motc.get_position(); uint16_t key_set_type_buf = 0; @@ -1217,7 +1217,7 @@ inline static const char* mot_move_data_string(const char* str, static void mot_data_move_data(mot_data* mot_dst, const mot_data* mot_src, prj::shared_ptr alloc) { mot_dst->info = mot_src->info; - mot_dst->frame_count = mot_src->frame_count; + mot_dst->frame_max = mot_src->frame_max; mot_dst->bone_info_count = mot_src->bone_info_count; mot_dst->murmurhash = mot_src->murmurhash; diff --git a/src/KKdLib/mot.hpp b/src/KKdLib/mot.hpp index a196f71a..cd9f86ea 100644 --- a/src/KKdLib/mot.hpp +++ b/src/KKdLib/mot.hpp @@ -45,12 +45,12 @@ struct mot_data { union { struct { uint16_t key_set_count : 14; - uint16_t skeleton_select : 1; - uint16_t high_bit : 1; + uint16_t motion_body_type : 1; + uint16_t key_num_type : 1; }; uint16_t info; }; - uint16_t frame_count; + uint16_t frame_max; int32_t bone_info_count; uint32_t murmurhash; diff --git a/src/KKdLib/obj.cpp b/src/KKdLib/obj.cpp index 92ad6786..506e3a46 100644 --- a/src/KKdLib/obj.cpp +++ b/src/KKdLib/obj.cpp @@ -40,7 +40,7 @@ struct obj_skin_ex_data_header { int64_t osage_joint_offset; int64_t root_name_offset; int64_t ex_node_array_offset; - int32_t nb_node_name; + uint32_t nb_node_name; int64_t ex_node_name_offset; int64_t osage_constraint_tbl_offset; int32_t nb_cloth; @@ -959,11 +959,11 @@ static obj_skin_ex_data* obj_move_data_skin_ex_data(const obj_skin_ex_data* ex_s ex_dst->ex_node_table = ex_node_array_dst; ex_dst->num_ex_node = num_ex_node; - int32_t nb_node_name = ex_src->nb_node_name; + uint32_t nb_node_name = ex_src->nb_node_name; const char** ex_node_name_src = ex_src->ex_node_name; const char** ex_node_name_dst = alloc->allocate(nb_node_name); - for (int32_t i = 0; i < nb_node_name; i++) + for (uint32_t i = 0; i < nb_node_name; i++) ex_node_name_dst[i] = obj_move_data_string(ex_node_name_src[i], alloc); ex_dst->nb_node_name = nb_node_name; @@ -1268,12 +1268,9 @@ static void obj_set_classic_read_inner(obj_set* set, prj::shared_ptrskin = obj_classic_read_skin(alloc, s, obj_skin_data[i]); - if (osh.obj_name_data && obj_name_data[i]) { + if (osh.obj_name_data) obj->name = obj_read_utf8_string_null_terminated_offset(alloc, s, obj_name_data[i]); - obj->hash = hash_utf8_murmurhash(obj->name); - } - else - obj->hash = hash_murmurhash_empty; + obj->hash = obj->name ? hash_utf8_murmurhash(obj->name) : hash_murmurhash_empty; } s.set_position(osh.obj_id_data, SEEK_SET); @@ -2109,7 +2106,7 @@ static void obj_classic_write_skin(obj_skin* sk, stream& s, int64_t base_offset) } } - exh.nb_node_name = (int32_t)bone_names.size(); + exh.nb_node_name = (uint32_t)bone_names.size(); exh.ex_node_name_offset = s.get_position(); for (string_hash& i : bone_names) s.write_int32_t(0); @@ -2526,7 +2523,7 @@ static void obj_classic_write_skin(obj_skin* sk, stream& s, int64_t base_offset) s.write_uint32_t((uint32_t)exh.osage_joint_offset); s.write_uint32_t((uint32_t)exh.root_name_offset); s.write_uint32_t((uint32_t)exh.ex_node_array_offset); - s.write_int32_t(exh.nb_node_name); + s.write_uint32_t(exh.nb_node_name); s.write_uint32_t((uint32_t)exh.ex_node_name_offset); s.write_uint32_t((uint32_t)exh.osage_constraint_tbl_offset); s.write_int32_t(exh.nb_cloth); @@ -2563,7 +2560,7 @@ static obj_skin_ex_data* obj_classic_read_skin_ex_data(prj::shared_ptrallocate(nb_node_name); if (!ex_node_name) return ex; @@ -2589,18 +2586,12 @@ static obj_skin_ex_data* obj_classic_read_skin_ex_data(prj::shared_ptrnb_node_name = nb_node_name; s.set_position(exh.ex_node_name_offset, SEEK_SET); - for (int32_t i = 0; i < nb_node_name; i++) { - int32_t string_offset = s.read_uint32_t(); - if (string_offset) - ex_node_name[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, string_offset); - else - ex_node_name[i] = 0; + for (uint32_t i = 0; i < nb_node_name; i++) { + uint32_t string_offset = s.read_uint32_t(); + ex_node_name[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, string_offset); } - if (exh.osage_root_offset) - ex->osage_root = obj_read_utf8_string_null_terminated_offset(alloc, s, exh.osage_root_offset); - else - ex->osage_root = 0; + ex->osage_root = obj_read_utf8_string_null_terminated_offset(alloc, s, exh.osage_root_offset); if (exh.osage_joint_offset) { ex->osage_joint = alloc->allocate(ex->nb_jointX); @@ -3218,8 +3209,7 @@ static obj_skin_ex_node_expression* obj_classic_read_skin_ex_node_expression( exp->nb_src = nb_src; for (int32_t i = 0; i < nb_src; i++) { uint32_t script_offset = s.read_uint32_t(); - if (script_offset) - exp->script[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, script_offset); + exp->script[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, script_offset); } for (int32_t i = nb_src; i < 9; i++) @@ -4005,12 +3995,9 @@ static void obj_set_modern_read_inner(obj_set* set, prj::shared_ptrobj_data[i]; - if (osh.obj_name_data && obj_name_data[i]) { + if (osh.obj_name_data) obj->name = obj_read_utf8_string_null_terminated_offset(alloc, s_mosd, obj_name_data[i]); - obj->hash = hash_utf8_murmurhash(obj->name); - } - else - obj->hash = hash_murmurhash_empty; + obj->hash = obj->name ? hash_utf8_murmurhash(obj->name) : hash_murmurhash_empty; } if (osh.obj_id_data) { @@ -5365,7 +5352,7 @@ static void obj_modern_write_skin(obj_skin* sk, stream& s, exh.nb_root++; } - exh.nb_node_name = (int32_t)bone_names.size(); + exh.nb_node_name = (uint32_t)bone_names.size(); } if (sk->ex_data) { @@ -5421,13 +5408,13 @@ static void obj_modern_write_skin(obj_skin* sk, stream& s, } if (!is_x) { - ee = { off, 1, 4, (uint32_t)exh.nb_node_name }; + ee = { off, 1, 4, exh.nb_node_name }; ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); off = (uint32_t)(exh.nb_node_name * 4ULL); } else { - ee = { off, 1, 8, (uint32_t)exh.nb_node_name }; + ee = { off, 1, 8, exh.nb_node_name }; ee.append(0, 1, ENRS_QWORD); e.vec.push_back(ee); off = (uint32_t)(exh.nb_node_name * 8ULL); @@ -6506,7 +6493,7 @@ static void obj_modern_write_skin(obj_skin* sk, stream& s, s.write_offset_f2(exh.osage_joint_offset, 0x20); s.write_offset_f2(exh.root_name_offset, 0x20); s.write_offset_f2(exh.ex_node_array_offset, 0x20); - s.write_int32_t_reverse_endianness(exh.nb_node_name); + s.write_uint32_t_reverse_endianness(exh.nb_node_name); s.write_offset_f2(exh.ex_node_name_offset, 0x20); s.write_offset_f2(exh.osage_constraint_tbl_offset, 0x20); s.write_int32_t_reverse_endianness(exh.nb_cloth); @@ -6525,7 +6512,7 @@ static void obj_modern_write_skin(obj_skin* sk, stream& s, s.write_offset_x(exh.osage_joint_offset); s.write_offset_x(exh.root_name_offset); s.write_offset_x(exh.ex_node_array_offset); - s.write_int32_t_reverse_endianness(exh.nb_node_name); + s.write_uint32_t_reverse_endianness(exh.nb_node_name); s.write_offset_x(exh.ex_node_name_offset); s.write_offset_x(exh.osage_constraint_tbl_offset); s.write_int32_t_reverse_endianness(exh.nb_cloth); @@ -6578,7 +6565,7 @@ static obj_skin_ex_data* obj_modern_read_skin_ex_data(prj::shared_ptrallocate(nb_node_name); ex->ex_node_name = ex_node_name; @@ -6624,26 +6611,17 @@ static obj_skin_ex_data* obj_modern_read_skin_ex_data(prj::shared_ptrosage_root = obj_read_utf8_string_null_terminated_offset(alloc, s, exh.osage_root_offset); - else - ex->osage_root = 0; + ex->osage_root = obj_read_utf8_string_null_terminated_offset(alloc, s, exh.osage_root_offset); if (exh.osage_joint_offset) { ex->osage_joint = alloc->allocate(ex->nb_jointX); @@ -7296,14 +7274,12 @@ static obj_skin_ex_node_expression* obj_modern_read_skin_ex_node_expression( if (!is_x) for (int32_t i = 0; i < nb_src; i++) { int64_t script_offset = s.read_offset_f2(header_length); - if (script_offset) - exp->script[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, script_offset); + exp->script[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, script_offset); } else for (int32_t i = 0; i < nb_src; i++) { int64_t script_offset = s.read_offset_x(); - if (script_offset) - exp->script[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, script_offset); + exp->script[i] = obj_read_utf8_string_null_terminated_offset(alloc, s, script_offset); } for (int32_t i = nb_src; i < 9; i++) @@ -7855,6 +7831,9 @@ inline static const char* obj_move_data_string(const char* str, inline static const char* obj_read_utf8_string_null_terminated_offset( prj::shared_ptr& alloc, stream& s, int64_t offset) { + if (!offset) + return 0; + size_t len = s.read_utf8_string_null_terminated_offset_length(offset); char* str = alloc->allocate(len + 1); s.position_push(offset, SEEK_SET); diff --git a/src/KKdLib/obj.hpp b/src/KKdLib/obj.hpp index 8bf38d65..5b74e34e 100644 --- a/src/KKdLib/obj.hpp +++ b/src/KKdLib/obj.hpp @@ -651,7 +651,7 @@ struct obj_skin_ex_data { obj_skin_osage_joint* osage_joint; obj_skin_ex_node* ex_node_table; int32_t num_ex_node; - int32_t nb_node_name; + uint32_t nb_node_name; const char** ex_node_name; obj_skin_osage_constraint_info* osage_constraint_tbl; int32_t num_osage_constraint; diff --git a/src/KKdLib/post_process_table/dof.cpp b/src/KKdLib/post_process_table/dof.cpp index 8e745fb1..8e195ae7 100644 --- a/src/KKdLib/post_process_table/dof.cpp +++ b/src/KKdLib/post_process_table/dof.cpp @@ -156,7 +156,7 @@ static void dof_read_inner(dof* d, stream& s, uint32_t header_length) { i.fuzzing_range = s.read_float_t_reverse_endianness(i.fuzzing_range); i.ratio = s.read_float_t_reverse_endianness(i.ratio); i.quality = s.read_float_t_reverse_endianness(i.quality); - i.chara_id = -1; + i.rob_id = -1; } s.position_pop(); } @@ -173,7 +173,7 @@ static void dof_read_inner(dof* d, stream& s, uint32_t header_length) { i.fuzzing_range = s.read_float_t_reverse_endianness(i.fuzzing_range); i.ratio = s.read_float_t_reverse_endianness(i.ratio); i.quality = s.read_float_t_reverse_endianness(i.quality); - i.chara_id = s.read_int32_t_reverse_endianness(i.chara_id); + i.rob_id = s.read_int32_t_reverse_endianness(i.rob_id); } s.position_pop(); } @@ -250,7 +250,7 @@ static void dof_write_inner(dof* d, stream& s) { s.write_float_t_reverse_endianness(i.fuzzing_range); s.write_float_t_reverse_endianness(i.ratio); s.write_float_t_reverse_endianness(i.quality); - s.write_int32_t_reverse_endianness(i.chara_id); + s.write_int32_t_reverse_endianness(i.rob_id); } } diff --git a/src/KKdLib/post_process_table/dof.hpp b/src/KKdLib/post_process_table/dof.hpp index fceb859b..2741bd59 100644 --- a/src/KKdLib/post_process_table/dof.hpp +++ b/src/KKdLib/post_process_table/dof.hpp @@ -24,7 +24,7 @@ struct dof_data { float_t fuzzing_range; float_t ratio; float_t quality; - int32_t chara_id; + int32_t rob_id; }; struct dof { diff --git a/src/KKdLib/prj/bit_array.hpp b/src/KKdLib/prj/bit_array.hpp new file mode 100644 index 00000000..c878ce23 --- /dev/null +++ b/src/KKdLib/prj/bit_array.hpp @@ -0,0 +1,225 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../default.hpp" + +namespace prj { + template + class BitArrayEmbCore { + public: + enum { + bits_per_block = sizeof(uint32_t) * 8, + }; + + static constexpr size_t size = n; + static constexpr size_t num_blocks = (n + bits_per_block - 1) / bits_per_block; + + uint32_t M_pool[num_blocks]; + }; + + template + class BitArrayExtCore { + public: + enum { + bits_per_block = sizeof(uint32_t) * 8, + }; + + static constexpr size_t size = n; + static constexpr size_t num_blocks = (n + bits_per_block - 1) / bits_per_block; + + uint32_t* M_pool; + }; + + template + class BitArrayUtil { + public: + enum { + bits_per_block = sizeof(uint32_t) * 8, + }; + }; + + template + class BitArrayBase { + private: + T M_core; + + public: + BitArrayBase(size_t count, uint32_t* data) : M_core() { + init(count, data); + } + + BitArrayBase(uint32_t* data) : M_core() { + init(data); + } + + BitArrayBase() : M_core() { + + } + + void init(uint32_t* data) { + BitArrayUtil::init(M_core, size(), num_blocks(), data); + } + + void init(size_t size, uint32_t* data) { + BitArrayUtil::init(M_core, size, num_blocks(), data); + M_reset_unused_bit(); + } + + private: + uint32_t* M_data() { + return M_core.M_pool; + } + + const uint32_t* M_data() const { + return M_core.M_pool; + } + + public: + constexpr size_t size() const { + return T::size; + } + + constexpr size_t max_size() const { + return num_blocks() * T::bits_per_block; + } + + constexpr size_t num_blocks() const { + return T::num_blocks; + } + + size_t count() const { + size_t sum = 0; + for (size_t i = 0; i < num_blocks(); i++) + sum += S_mask_count(M_data()[i]); + return sum; + } + + private: + size_t M_find0(size_t); + size_t M_find1(size_t); + + public: + bool operator[](size_t pos) const { + return test(pos); + } + + bool test(size_t pos) const { + return ((M_data()[pos / T::bits_per_block] >> (pos % T::bits_per_block)) & 0x01) != 0x00; + } + + BitArrayBase& set(size_t pos) { + M_data()[pos / T::bits_per_block] |= 1u << (pos % T::bits_per_block); + return *this; + } + + BitArrayBase& set() { + for (size_t i = 0, j = 0; i < num_blocks(); i++) + M_data()[i] = 0xFFFFFFFFu; + M_reset_unused_bit(); + return *this; + } + + BitArrayBase& reset(size_t pos) { + M_data()[pos / T::bits_per_block] &= ~(1u << (pos % T::bits_per_block)); + return *this; + } + + BitArrayBase& reset() { + for (size_t i = 0; i < num_blocks(); i++) + M_data()[i] = 0; + return *this; + } + + BitArrayBase& flip(size_t pos) { + set(pos, !test(pos)); + return *this; + } + + BitArrayBase& flip() { + for (size_t i = 0; i < num_blocks(); i++) + M_data()[i] ^= 0xFFFFFFFFu; + M_reset_unused_bit(); + return *this; + } + + private: + void M_reset_unused_bit() { + M_data()[num_blocks() - 1] &= ~(0xFFFFFFFFu << (32 - (max_size() - size()))); + } + + void M_block_dump(); + void M_dump(); + void M_dump0(); + void M_dump1(); + size_t word(size_t); + size_t offset(size_t); + + size_t S_mask2bit(uint32_t); + + size_t S_mask_count(uint32_t x) const { + x = (x & 0x55555555) + ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); + x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); + x = (x & 0x0000FFFF) + ((x >> 16) & 0x0000FFFF); + return x; + } + + public: + size_t calc_num_blocks(size_t n) const { + return (n + T::bits_per_block - 1) / T::bits_per_block; + } + + bool operator==(const BitArrayBase& right) const { + for (size_t i = 0; i < num_blocks(); i++) + if (M_data()[i] != right.M_data()[i]) + return false; + return true; + } + + void operator&=(const BitArrayBase& right) { + for (size_t i = 0; i < num_blocks(); i++) + M_data()[i] &= right.M_data()[i]; + } + + void operator|=(const BitArrayBase& right) { + for (size_t i = 0; i < num_blocks(); i++) + M_data()[i] |= right.M_data()[i]; + } + }; + + template + struct BitArrayUtil > { + static void init(BitArrayEmbCore& core, size_t size, size_t num_blocks, uint32_t* data) { + for (size_t i = 0; i < num_blocks; ++i) + core.M_pool[i] = data[i]; + } + }; + + template + struct BitArrayUtil > { + static void init(BitArrayExtCore& core, size_t size, size_t num_blocks, uint32_t* data) { + core.M_pool = data; + } + }; + + template + class BitArray : public BitArrayBase> { + public: + BitArray(size_t count, const uint32_t* data) : BitArrayBase>(count, (uint32_t*)data) {} + BitArray(const uint32_t* data) : BitArrayBase>((uint32_t*)data) {} + BitArray() : BitArrayBase>() {} + }; + + template + class BitArrayExt : public BitArrayBase> { + public: + BitArrayExt(size_t count, uint32_t* data) : BitArrayBase>(count, data) {} + BitArrayExt(uint32_t* data) : BitArrayBase>(data) {} + BitArrayExt() : BitArrayBase>() {}; + }; +} diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index b2a54d81..f27b41ba 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -866,7 +866,7 @@ static render_context* render_context_load(const wchar_t* config_path) { Glitter::glt_particle_manager_add_task(); for (int32_t i = 0; i < ROB_ID_MAX; i++) - rob_chara_array_reset_pv_data(i); + rob_chara_array_reset_pv_data((ROB_ID)i); light_param_data_storage_data_load(); diff --git a/src/ReDIVA/data_edit/face_anim.cpp b/src/ReDIVA/data_edit/face_anim.cpp index 11e4637a..b7cf0c2e 100644 --- a/src/ReDIVA/data_edit/face_anim.cpp +++ b/src/ReDIVA/data_edit/face_anim.cpp @@ -282,7 +282,7 @@ void FaceAnim::Auth3D::reset() { tex_db.clear(); } -FaceAnim::FaceAnim() : state(), play(), sound_play(), frame(), frame_count() { +FaceAnim::FaceAnim() : state(), play(), sound_play(), frame(), frame_max() { } @@ -345,7 +345,7 @@ bool FaceAnim::ctrl() { auth_3d.patch(); frame = 5000; - frame_count = (int32_t)auth_3d.id.get_last_frame(); + frame_max = (int32_t)auth_3d.id.get_last_frame(); ogg_path.assign("H:\\C\\Documents\\A\\pv826\\lipsync\\01_rin.ogg"); //sound_work_play_stream(0, ogg_path.c_str(), (float_t)((double_t)frame / 60.0)); @@ -366,7 +366,7 @@ bool FaceAnim::ctrl() { if (play) frame++; - if (frame >= frame_count) { + if (frame >= frame_max) { frame = 5000; sound_work_release_stream(0); @@ -414,7 +414,7 @@ void FaceAnim::window() { if (ImGui::Button(play ? "Pause" : "Play")) play ^= true; - ImGui::Text("% 5d/% 5d", frame, frame_count); + ImGui::Text("% 5d/% 5d", frame, frame_max); ImGui::End(); } @@ -427,6 +427,6 @@ void FaceAnim::reset() { play = false; sound_play = false; frame = 0; - frame_count = 0; + frame_max = 0; } #endif diff --git a/src/ReDIVA/data_edit/face_anim.hpp b/src/ReDIVA/data_edit/face_anim.hpp index 08ae4057..828155d2 100644 --- a/src/ReDIVA/data_edit/face_anim.hpp +++ b/src/ReDIVA/data_edit/face_anim.hpp @@ -37,7 +37,7 @@ public: bool play; bool sound_play; int32_t frame; - int32_t frame_count; + int32_t frame_max; FaceAnim(); virtual ~FaceAnim() override; diff --git a/src/ReDIVA/data_edit/glitter_editor.cpp b/src/ReDIVA/data_edit/glitter_editor.cpp index 4c9e65fe..c432768e 100644 --- a/src/ReDIVA/data_edit/glitter_editor.cpp +++ b/src/ReDIVA/data_edit/glitter_editor.cpp @@ -3075,9 +3075,9 @@ static void glitter_editor_property_effect(GlitterEditor* glt_edt) { Glitter::Effect::ExtAnimX* ext_anim = effect->data.ext_anim_x; if (ext_anim->flags & Glitter::EFFECT_EXT_ANIM_CHARA) { - const int32_t max_chara = 4; - if (ImGui::ColumnComboBox("Chara Index", Glitter::effect_ext_anim_index_name, - max_chara, &ext_anim->chara_index, 0, false, &input_locked)) + const int32_t max_rob_id = 4; + if (ImGui::ColumnComboBox("Rob ID", Glitter::effect_ext_anim_rob_id_name, + max_rob_id, &ext_anim->rob_id, 0, false, &input_locked)) changed = true; int32_t node_index = ext_anim->node_index; @@ -3166,9 +3166,9 @@ static void glitter_editor_property_effect(GlitterEditor* glt_edt) { Glitter::Effect::ExtAnim* ext_anim = effect->data.ext_anim; if (ext_anim->flags & Glitter::EFFECT_EXT_ANIM_CHARA) { - const int32_t max_chara = eg->type == Glitter::FT ? 6 : 3; - if (ImGui::ColumnComboBox("Chara Index", Glitter::effect_ext_anim_index_name, - max_chara, &ext_anim->chara_index, 0, false, &input_locked)) + const int32_t max_rob_id = eg->type == Glitter::FT ? 6 : 4; + if (ImGui::ColumnComboBox("ROB ID", Glitter::effect_ext_anim_rob_id_name, + max_rob_id, &ext_anim->rob_id, 0, false, &input_locked)) changed = true; int32_t node_index = ext_anim->node_index; diff --git a/src/ReDIVA/data_edit/rob_chara_adjust.cpp b/src/ReDIVA/data_edit/rob_chara_adjust.cpp index fcdebfa7..b062665f 100644 --- a/src/ReDIVA/data_edit/rob_chara_adjust.cpp +++ b/src/ReDIVA/data_edit/rob_chara_adjust.cpp @@ -74,8 +74,8 @@ bool RobCharaAdjust::init() { } bool RobCharaAdjust::ctrl() { - if (motion_id != dtm_mot_array[chara_id].motion_id) { - motion_id = dtm_mot_array[chara_id].motion_id; + if (motion_id != dtm_mot_array[chara_id].uid) { + motion_id = dtm_mot_array[chara_id].uid; parts = ROB_OSAGE_PARTS_NONE; data = 0; } @@ -88,7 +88,7 @@ bool RobCharaAdjust::ctrl() { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - uint32_t set_id = dtm_mot_array[chara_id].motion_set_id; + uint32_t set_id = dtm_mot_array[chara_id].set; MhdFile* mhd = mothead_storage_get_mhd_file(set_id); const motion_set_info* set_info = aft_mot_db->get_motion_set_by_id(set_id); @@ -223,19 +223,19 @@ void RobCharaAdjust::window() { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; float_t frame = dtm_mot_array[chara_id].GetFrame(); - const mothead_data* data = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->data; - if (data) { - mothead_data_type type = data->type; - while (type >= MOTHEAD_DATA_TYPE_0) { - if ((type == MOTHEAD_DATA_ROB_PARTS_ADJUST - && ((RobCharaAdjust::PartsData*)data->data)->parts == parts - || type == MOTHEAD_DATA_ROB_ADJUST_GLOBAL) - && frame >= (float_t)data->frame) { - this->data = (void*)data->data; + const MhpList* pp_list = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->pp_list; + if (pp_list) { + int32_t type = pp_list->type; + while (type >= 0) { + if ((type == MHP_ROB_PARTS_ADJUST + && ((RobCharaAdjust::PartsData*)pp_list->data)->parts == parts + || type == MHP_ROB_ADJUST_GLOBAL) + && frame >= (float_t)pp_list->frame) { + data = pp_list->data; } - data++; - type = data->type; + pp_list++; + type = pp_list->type; } } } @@ -245,23 +245,23 @@ void RobCharaAdjust::window() { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - const mothead_data* data = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->data; - if (data) { - mothead_data_type type = data->type; - while (type >= MOTHEAD_DATA_TYPE_0) { - if (type == MOTHEAD_DATA_ROB_PARTS_ADJUST - && ((RobCharaAdjust::PartsData*)data->data)->parts == parts - || type == MOTHEAD_DATA_ROB_ADJUST_GLOBAL) { + MhpList* pp_list = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->pp_list; + if (pp_list) { + int32_t type = pp_list->type; + while (type >= 0) { + if (type == MHP_ROB_PARTS_ADJUST + && ((RobCharaAdjust::PartsData*)pp_list->data)->parts == parts + || type == MHP_ROB_ADJUST_GLOBAL) { char buf[0x40]; - sprintf_s(buf, sizeof(buf), "%d", data->frame); + sprintf_s(buf, sizeof(buf), "%d", pp_list->frame); ImGui::PushID(data); - if (ImGui::Selectable(buf, this->data == data->data) && !track_frame) - this->data = (void*)data->data; + if (ImGui::Selectable(buf, data == pp_list->data) && !track_frame) + data = pp_list->data; ImGui::PopID(); } - data++; - type = data->type; + pp_list++; + type = pp_list->type; } } ImGui::EndListBox(); diff --git a/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp b/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp index fb44a527..79ee37d9 100644 --- a/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp +++ b/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp @@ -100,7 +100,7 @@ struct mot_data_bake { struct effchrpv_auth_3d_to_mot { int32_t pv_id; - const int32_t* rob_chara_ids; + const ROB_ID* rob_ids; std::unordered_map auth_3d_mot_names; std::map auth_3d_mot_ids; @@ -131,6 +131,7 @@ struct effchrpv_auth_3d_to_mot { void add_chara_effect_auth_3d(uint32_t hash, int32_t id); void add_file_name(const std::string& file, const std::string& category); + void disp(); void get_body_anim(int32_t frame, bool add_keys); void get_hand_anim(int32_t frame); void load(int32_t frame); @@ -143,12 +144,12 @@ effchrpv_auth_3d_to_mot* effchr_a2m; extern render_context* rctx_ptr; -void effchrpv_auth_3d_to_mot_init(int32_t pv_id, const int32_t* rob_chara_ids) { +void effchrpv_auth_3d_to_mot_init(int32_t pv_id, const ROB_ID* rob_ids) { if (!effchr_a2m) effchr_a2m = new effchrpv_auth_3d_to_mot; effchr_a2m->pv_id = pv_id; - effchr_a2m->rob_chara_ids = rob_chara_ids; + effchr_a2m->rob_ids = rob_ids; effchr_a2m->bake.pv_id = pv_id; } @@ -161,6 +162,10 @@ void effchrpv_auth_3d_to_mot_add_file_name(const std::string& file, const std::s effchr_a2m->add_file_name(file, category); } +void effchrpv_auth_3d_to_mot_disp() { + effchr_a2m->disp(); +} + void effchrpv_auth_3d_to_mot_get_body_anim(int32_t frame, bool add_keys) { effchr_a2m->get_body_anim(frame, add_keys); } @@ -358,7 +363,7 @@ bool mot_data_bake::load_file(void* data, const char* path, const char* file, ui return true; } -effchrpv_auth_3d_to_mot::effchrpv_auth_3d_to_mot() : pv_id(), rob_chara_ids() { +effchrpv_auth_3d_to_mot::effchrpv_auth_3d_to_mot() : pv_id(), rob_ids() { } @@ -374,10 +379,28 @@ void effchrpv_auth_3d_to_mot::add_file_name(const std::string& file, const std:: auth_3d_mot_names.insert({ file, category }); } +void effchrpv_auth_3d_to_mot::disp() { + /*for (auto& i : auth_3d_rob_mot_ids) { + rob_chara* rob_chr = rob_chara_array_get(rob_ids[i.first]); + auth_3d_to_mot_data& a2m = i.second; + auth_3d* auth = a2m.id.get_auth_3d(); + auth_3d_object_hrc* oh = &auth->object_hrc[0]; + + mat4 mat; + mat = oh->node[a2m.j_mune_wj].model_transform.mat; + mat4_scale_rot(&mat, 0.1f, &mat); + spr::put_rgb_cross(mat); + + mat = oh->node[a2m.j_kao_wj].model_transform.mat; + mat4_scale_rot(&mat, 0.1f, &mat); + spr::put_rgb_cross(mat); + }*/ +} + static void set_bone_key_set_global_data( std::map& bone_keys, std::map& second_bone_keys, bool add_keys, - motion_blend_mot* mot, mot_key_set* key_set, const vec3* data, const int32_t count = 1) { + motion_blend_mot* mot, FcurveKey* fck, const vec3* data, const int32_t count = 1) { if (add_keys) { auto elem = bone_keys.find(BLK_MAX); if (elem == bone_keys.end()) @@ -400,15 +423,15 @@ static void set_bone_key_set_global_data( } } - key_set += mot->bone_data.bone_key_set_count; + fck += mot->bone_data.bone_key_set_count; for (int32_t i = 0; i < count; i++) { - if (key_set[0].type == MOT_KEY_SET_STATIC && key_set[0].values) - *(float_t*)&key_set[0].values[0] = data[i].x; - if (key_set[1].type == MOT_KEY_SET_STATIC && key_set[1].values) - *(float_t*)&key_set[1].values[0] = data[i].y; - if (key_set[2].type == MOT_KEY_SET_STATIC && key_set[2].values) - *(float_t*)&key_set[2].values[0] = data[i].z; - key_set += 3; + if (fck[0].kind == FCURVE_KEY_KIND_STATIC_DATA && fck[0].val) + *(float_t*)&fck[0].val[0] = data[i].x; + if (fck[1].kind == FCURVE_KEY_KIND_STATIC_DATA && fck[1].val) + *(float_t*)&fck[1].val[0] = data[i].y; + if (fck[2].kind == FCURVE_KEY_KIND_STATIC_DATA && fck[2].val) + *(float_t*)&fck[2].val[0] = data[i].z; + fck += 3; } mot->bone_data.gblctr_pos = data[0]; @@ -417,15 +440,15 @@ static void set_bone_key_set_global_data( mot->apply_global_transform(); } -static void set_bone_key_set_data(RobBlock* block, +static void set_bone_key_set_data(RobBlock* block_top, std::map& bone_keys, std::map& second_bone_keys, bool add_keys, - BONE_BLK block_id, int32_t& curr_block_id, int32_t skeleton_select, - mot_key_set* key_set, const vec3* data, const int32_t count = 1) { + BONE_BLK blk, int32_t& curr_block_id, int32_t motion_body_type, + FcurveKey* fck, const vec3* data, const int32_t count = 1) { if (add_keys) { - auto elem = bone_keys.find(block_id); + auto elem = bone_keys.find(blk); if (elem == bone_keys.end()) - elem = bone_keys.insert({ block_id, {} }).first; + elem = bone_keys.insert({ blk, {} }).first; auth_3d_to_mot_keys& keys = elem->second; keys.x.push_back(data[0].x); @@ -433,9 +456,9 @@ static void set_bone_key_set_data(RobBlock* block, keys.z.push_back(data[0].z); if (count == 2) { - auto elem = second_bone_keys.find(block_id); + auto elem = second_bone_keys.find(blk); if (elem == second_bone_keys.end()) - elem = second_bone_keys.insert({ block_id, {} }).first; + elem = second_bone_keys.insert({ blk, {} }).first; auth_3d_to_mot_keys& keys = elem->second; keys.x.push_back(data[1].x); @@ -444,22 +467,22 @@ static void set_bone_key_set_data(RobBlock* block, } } - key_set += block[block_id].key_set_offset; - block[block_id].frame = -FLT_MAX; + fck += block_top[blk].key_set_offset; + block_top[blk].frame = -FLT_MAX; for (int32_t i = 0; i < count; i++) { - if (key_set[0].type == MOT_KEY_SET_STATIC && key_set[0].values) - *(float_t*)&key_set[0].values[0] = data[i].x; - if (key_set[1].type == MOT_KEY_SET_STATIC && key_set[1].values) - *(float_t*)&key_set[1].values[0] = data[i].y; - if (key_set[2].type == MOT_KEY_SET_STATIC && key_set[2].values) - *(float_t*)&key_set[2].values[0] = data[i].z; - key_set += 3; + if (fck[0].kind == FCURVE_KEY_KIND_STATIC_DATA && fck[0].val) + *(float_t*)&fck[0].val[0] = data[i].x; + if (fck[1].kind == FCURVE_KEY_KIND_STATIC_DATA && fck[1].val) + *(float_t*)&fck[1].val[0] = data[i].y; + if (fck[2].kind == FCURVE_KEY_KIND_STATIC_DATA && fck[2].val) + *(float_t*)&fck[2].val[0] = data[i].z; + fck += 3; } - block[block_id].set_global_leaf_sub(data, BONE_KIND_CMN, true, false); + block_top[blk].set_global_leaf_sub(data, BONE_KIND_CMN, true, false); - while (curr_block_id <= block_id) - block[curr_block_id++].get_mat(skeleton_select); + while (curr_block_id <= blk) + block_top[curr_block_id++].get_mat(motion_body_type); } static void rotate_euler(const mat4& src, const mat4& dst, const vec3& src_rotation, vec3& dst_rotation) { @@ -480,23 +503,23 @@ static void rotate_euler(const mat4& src, const mat4& dst, const vec3& src_rotat mat4_get_rotation_zxy(&rot, &dst_rotation); } -static void set_bone_key_set_ik_target_data(auth_3d_to_mot_data& a2m, - const mat4& parent_mat, const vec3 rotation, RobBlock* block, mot_key_set* key_set, bool add_keys, - BONE_BLK block_id, int32_t& curr_block_id, int32_t skeleton_select, +static void set_bone_key_set_ik_target_data(auth_3d_to_mot_data& a2m, const mat4& mat, + const vec3 rotation, RobBlock* block_top, FcurveKey* fck, bool add_keys, + BONE_BLK blk, int32_t& curr_block_id, int32_t motion_body_type, const vec3& position, const mat4& src, const mat4& dst, const bool disable_rot[3], bool offset = true) { vec3 data[2]; if (offset) { data[0] = position; - mat4_transform_point(&parent_mat, &data[0], &data[0]); + mat4_transform_point(&mat, &data[0], &data[0]); data[1] = rotation; rotate_euler(src, dst, data[1], data[1]); int32_t _curr_block_id = curr_block_id; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, false, - block_id, _curr_block_id, skeleton_select, key_set, data, 2); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, false, + blk, _curr_block_id, motion_body_type, fck, data, 2); data[0] = position; - mat4_transform_point(block[block_id].node[0].mat_ptr, &data[0], &data[0]); + mat4_transform_point(block_top[blk].node[0].mat_ptr, &data[0], &data[0]); } else data[0] = position; @@ -508,15 +531,15 @@ static void set_bone_key_set_ik_target_data(auth_3d_to_mot_data& a2m, if (disable_rot[i]) (&data[1].x)[i] = 0.0f; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - block_id, curr_block_id, skeleton_select, key_set, data, 2); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + blk, curr_block_id, motion_body_type, fck, data, 2); } static void set_bone_key_set_arm_ik_target_data(auth_3d_to_mot_data& a2m, auth_3d_object_hrc* oh, const mat4& kata_mat, const mat4& ude_mat, const mat4& te_mat, - const vec3 c_kata_rotation, RobBlock* block, mot_key_set* key_set, bool add_keys, + const vec3 c_kata_rotation, RobBlock* block_top, FcurveKey* fck, bool add_keys, BONE_BLK tl_up_kata_index, BONE_BLK c_kata_index, - int32_t& curr_block_id, int32_t skeleton_select) { + int32_t& curr_block_id, int32_t motion_body_type) { vec3 pos_kata; vec3 pos_ude; vec3 pos_te; @@ -524,7 +547,7 @@ static void set_bone_key_set_arm_ik_target_data(auth_3d_to_mot_data& a2m, auth_3 mat4_get_translation(&ude_mat, &pos_ude); mat4_get_translation(&te_mat, &pos_te); - RobBlock* c_kata = &block[c_kata_index]; + RobBlock* c_kata = &block_top[c_kata_index]; float_t arm_length = c_kata->len[0][0] + c_kata->len[1][0]; vec3 pos_ude_mid = vec3::lerp(pos_kata, pos_te, c_kata->len[0][0] / arm_length); @@ -539,15 +562,15 @@ static void set_bone_key_set_arm_ik_target_data(auth_3d_to_mot_data& a2m, auth_3 vec3 data[2]; vec3 tl_up_kata_pos = tl_up_kata_dir + pos_ude; - mat4* mat = block[BLK_KL_MUNE_B_WJ].node[0].mat_ptr; + mat4* mat = block_top[BLK_KL_MUNE_B_WJ].node[0].mat_ptr; mat4_inverse_transform_point(mat, &tl_up_kata_pos, &data[0]); - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - tl_up_kata_index, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + tl_up_kata_index, curr_block_id, motion_body_type, fck, data); data[0] = pos_te; data[1] = c_kata_rotation; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - c_kata_index, curr_block_id, skeleton_select, key_set, data, 2); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + c_kata_index, curr_block_id, motion_body_type, fck, data, 2); } void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { @@ -556,7 +579,7 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { static bool disable_cl_momo_rot[3] = { false, false, true }; for (auto& i : auth_3d_rob_mot_ids) { - rob_chara* rob_chr = rob_chara_array_get(rob_chara_ids[i.first]); + rob_chara* rob_chr = get_rob_management()->get_rob(rob_ids[i.first]); auth_3d_to_mot_data& a2m = i.second; auth_3d* auth = a2m.id.get_auth_3d(); auth_3d_object_hrc* oh = &auth->object_hrc[0]; @@ -569,60 +592,60 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { auth->paused = true; auth->ctrl(rctx_ptr); - rob_chr->set_visibility(oh->node[0].model_transform.visible); + rob_chr->set_disp_flag(oh->node[0].model_transform.visible); motion_blend_mot* mot = rob_chr->bone_data->motion_loaded.front(); - RobBlock* block = mot->bone_data.bones.data(); - mot_key_set* key_set = mot->mot_key_data.mot.key_sets; + RobBlock* block_top = mot->bone_data.block_vec.data(); + FcurveKey* fck = mot->mot_key_data.mot.fck_ptr; int32_t curr_block_id = 0; - int32_t skeleton_select = mot->mot_key_data.skeleton_select; + int32_t motion_body_type = mot->mot_key_data.motion_body_type; vec3 data[2]; data[0] = 0.0f; data[1] = oh->node[a2m.gblctr].model_transform.rotation_value; set_bone_key_set_global_data(a2m.bone_keys, a2m.sec_bone_keys, add_keys, - mot, key_set, data, 2); + mot, fck, data, 2); data[0] = oh->node[a2m.gblctr].model_transform.translation_value; data[0] += oh->node[a2m.n_hara].model_transform.translation_value; data[1] = oh->node[a2m.n_hara].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_N_HARA_CP, curr_block_id, skeleton_select, key_set, data, 2); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_N_HARA_CP, curr_block_id, motion_body_type, fck, data, 2); data[0] = oh->node[a2m.n_hara_y].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KG_HARA_Y, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KG_HARA_Y, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.j_hara_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_HARA_XZ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_HARA_XZ, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.n_kosi].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_N_HARA, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_N_HARA, curr_block_id, motion_body_type, fck, data); /*data[0] = { 0.0f, 0.945f, 0.0f }; mat4_transform_point(&oh->node[a2m.j_mune_wj].model_transform.mat, &data[0], &data[0]); data[1] = 0.0f; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_CL_MUNE, curr_block_id, skeleton_select, key_set, data, 2);*/ + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_CL_MUNE, curr_block_id, motion_body_type, fck, data, 2);*/ set_bone_key_set_ik_target_data(a2m, oh->node[a2m.j_mune_wj].model_transform.mat, - oh->node[a2m.j_mune_wj].model_transform.rotation_value, block, key_set, add_keys, - BLK_CL_MUNE, curr_block_id, skeleton_select, + oh->node[a2m.j_mune_wj].model_transform.rotation_value, block_top, fck, add_keys, + BLK_CL_MUNE, curr_block_id, motion_body_type, { 0.0f, 0.945f, 0.0f }, n_mune_b_src, n_mune_b_dst, disable_cl_mune_rot); data[0] = oh->node[a2m.j_mune_b_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_MUNE_B_WJ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_MUNE_B_WJ, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.j_kubi_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_KUBI, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_KUBI, curr_block_id, motion_body_type, fck, data); data[0] = { (float_t)(M_PI / 2.0), 0.0f, -(float_t)M_PI }; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_N_KAO, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_N_KAO, curr_block_id, motion_body_type, fck, data); /*data[0] = { 0.0f, 0.34f, 0.0f }; mat4_transform_point(&oh->node[a2m.j_kao_wj].model_transform.mat, &data[0], &data[0]); @@ -630,12 +653,12 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { //data[1].x = -data[1].x; //data[1].z = -data[1].z; //data[1] = 0.0f; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_CL_KAO, curr_block_id, skeleton_select, key_set, data, 2);*/ + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_CL_KAO, curr_block_id, motion_body_type, fck, data, 2);*/ set_bone_key_set_ik_target_data(a2m, oh->node[a2m.j_kao_wj].model_transform.mat, - oh->node[a2m.j_kao_wj].model_transform.rotation_value, block, key_set, add_keys, - BLK_CL_KAO, curr_block_id, skeleton_select, + oh->node[a2m.j_kao_wj].model_transform.rotation_value, block_top, fck, add_keys, + BLK_CL_KAO, curr_block_id, motion_body_type, { 0.0f, 0.34f, 0.0f }, n_kao_src, n_kao_dst, disable_cl_kao_rot); if (a2m.j_eye_r_wj != -1) { @@ -643,8 +666,8 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { data[0].x += (float_t)(M_PI / 2.0); data[0].y = -data[0].z; data[0].z = 0.0f; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_EYE_R, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_EYE_R, curr_block_id, motion_body_type, fck, data); } if (a2m.j_eye_l_wj != -1) { @@ -652,53 +675,53 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { data[0].x += (float_t)(M_PI / 2.0); data[0].y = -data[0].z; data[0].z = 0.0f; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_EYE_L, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_EYE_L, curr_block_id, motion_body_type, fck, data); } data[0] = oh->node[a2m.n_waki_l].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_N_WAKI_L, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_N_WAKI_L, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.j_waki_l_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_WAKI_L_WJ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_WAKI_L_WJ, curr_block_id, motion_body_type, fck, data); set_bone_key_set_arm_ik_target_data(a2m, oh, oh->node[a2m.j_kata_l_wj].model_transform.mat, oh->node[a2m.j_ude_l_wj].model_transform.mat, oh->node[a2m.j_te_l_wj].model_transform.mat, { -(float_t)(M_PI / 2.0), -(float_t)(M_PI / 2.0), -(float_t)(M_PI / 2.0) }, - block, key_set, add_keys, BLK_TL_UP_KATA_L, BLK_C_KATA_L, - curr_block_id, skeleton_select); + block_top, fck, add_keys, BLK_TL_UP_KATA_L, BLK_C_KATA_L, + curr_block_id, motion_body_type); data[0] = oh->node[a2m.j_te_l_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_TE_L_WJ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_TE_L_WJ, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.n_waki_r].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_N_WAKI_R, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_N_WAKI_R, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.j_waki_r_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_WAKI_R_WJ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_WAKI_R_WJ, curr_block_id, motion_body_type, fck, data); set_bone_key_set_arm_ik_target_data(a2m, oh, oh->node[a2m.j_kata_r_wj].model_transform.mat, oh->node[a2m.j_ude_r_wj].model_transform.mat, oh->node[a2m.j_te_r_wj].model_transform.mat, { -(float_t)(M_PI / 2.0), (float_t)(M_PI / 2.0), (float_t)(M_PI / 2.0) }, - block, key_set, add_keys, BLK_TL_UP_KATA_R, BLK_C_KATA_R, - curr_block_id, skeleton_select); + block_top, fck, add_keys, BLK_TL_UP_KATA_R, BLK_C_KATA_R, + curr_block_id, motion_body_type); data[0] = oh->node[a2m.j_te_r_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_TE_R_WJ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_TE_R_WJ, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.j_kosi_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_KOSI_XZ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_KOSI_XZ, curr_block_id, motion_body_type, fck, data); /*mat4_get_translation(&oh->node[a2m.j_asi_l_wj].model_transform.mat, &data[0]); data[0].y -= 0.033f; @@ -706,16 +729,16 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { data[0].y = 0.103f; data[1] = oh->node[a2m.j_momo_l_wj].model_transform.rotation_value; data[1].z -= (float_t)(M_PI / 2.0); - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_CL_MOMO_L, curr_block_id, skeleton_select, key_set, data, 2);*/ + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_CL_MOMO_L, curr_block_id, motion_body_type, fck, data, 2);*/ mat4_get_translation(&oh->node[a2m.j_asi_l_wj].model_transform.mat, &data[0]); data[0].y -= 0.033f; if (data[0].y < 0.103f) data[0].y = 0.103f; set_bone_key_set_ik_target_data(a2m, oh->node[a2m.j_momo_l_wj].model_transform.mat, - oh->node[a2m.j_momo_l_wj].model_transform.rotation_value, block, key_set, add_keys, - BLK_CL_MOMO_L, curr_block_id, skeleton_select, + oh->node[a2m.j_momo_l_wj].model_transform.rotation_value, block_top, fck, add_keys, + BLK_CL_MOMO_L, curr_block_id, motion_body_type, data[0], n_momo_l_src, cl_momo_l_dst, disable_cl_momo_rot, false); /*mat4_get_translation(&oh->node[a2m.j_asi_r_wj].model_transform.mat, &data[0]); @@ -724,33 +747,33 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { data[0].y = 0.103f; data[1] = oh->node[a2m.j_momo_r_wj].model_transform.rotation_value; data[1].z -= (float_t)(M_PI / 2.0); - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_CL_MOMO_R, curr_block_id, skeleton_select, key_set, data, 2);*/ + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_CL_MOMO_R, curr_block_id, motion_body_type, fck, data, 2);*/ mat4_get_translation(&oh->node[a2m.j_asi_r_wj].model_transform.mat, &data[0]); data[0].y -= 0.033f; if (data[0].y < 0.103f) data[0].y = 0.103f; set_bone_key_set_ik_target_data(a2m, oh->node[a2m.j_momo_r_wj].model_transform.mat, - oh->node[a2m.j_momo_r_wj].model_transform.rotation_value, block, key_set, add_keys, - BLK_CL_MOMO_R, curr_block_id, skeleton_select, + oh->node[a2m.j_momo_r_wj].model_transform.rotation_value, block_top, fck, add_keys, + BLK_CL_MOMO_R, curr_block_id, motion_body_type, data[0], n_momo_r_src, cl_momo_r_dst, disable_cl_momo_rot, false); data[0] = oh->node[a2m.j_asi_l_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_ASI_L_WJ_CO, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_ASI_L_WJ_CO, curr_block_id, motion_body_type, fck, data); data[0] = oh->node[a2m.j_asi_r_wj].model_transform.rotation_value; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_ASI_R_WJ_CO, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_ASI_R_WJ_CO, curr_block_id, motion_body_type, fck, data); data[0] = { 0.0491406508f, 0.0f, 0.0f }; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_KL_AGO_WJ, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_KL_AGO_WJ, curr_block_id, motion_body_type, fck, data); data[0] = { 0.0f, 0.0331281610f, 0.0f }; - set_bone_key_set_data(block, a2m.bone_keys, a2m.sec_bone_keys, add_keys, - BLK_N_KUBI_WJ_EX, curr_block_id, skeleton_select, key_set, data); + set_bone_key_set_data(block_top, a2m.bone_keys, a2m.sec_bone_keys, add_keys, + BLK_N_KUBI_WJ_EX, curr_block_id, motion_body_type, fck, data); //auth->frame = auth_frame; //auth->frame_changed = auth_frame_changed; @@ -760,30 +783,30 @@ void effchrpv_auth_3d_to_mot::get_body_anim(int32_t frame, bool add_keys) { void effchrpv_auth_3d_to_mot::get_hand_anim(int32_t frame) { for (auto& i : auth_3d_rob_mot_ids) { - rob_chara* rob_chr = rob_chara_array_get(rob_chara_ids[i.first]); + rob_chara* rob_chr = get_rob_management()->get_rob(rob_ids[i.first]); auth_3d_to_mot_data& a2m = i.second; rob_chara_bone_data* rob_bone_data = rob_chr->bone_data; - BONE_KIND skeleton_type = rob_bone_data->base_skeleton_type; + BONE_KIND kind = rob_bone_data->kind; motion_blend_mot* mot = rob_bone_data->motion_loaded.front(); - prj::sys_vector* bones = &mot->bone_data.bones; + prj::sys_vector* block_vec = &mot->bone_data.block_vec; prj::sys_vector* bone_indices = &mot->bone_data.bone_indices; - RobBlock* bones_data = bones->data(); + RobBlock* block_top = block_vec->data(); for (uint16_t& i : *bone_indices) { - RobBlock* data = &bones_data[i]; - BONE_BLK block_id = (BONE_BLK)data->block_id; - if (!(block_id >= BLK_N_HITO_L_EX && block_id <= BLK_NL_OYA_C_L_WJ - || block_id >= BLK_N_HITO_R_EX && block_id <= BLK_NL_OYA_C_R_WJ)) + RobBlock* block = &block_top[i]; + BONE_BLK blk = (BONE_BLK)block->block_id; + if (!(blk >= BLK_N_HITO_L_EX && blk <= BLK_NL_OYA_C_L_WJ + || blk >= BLK_N_HITO_R_EX && blk <= BLK_NL_OYA_C_R_WJ)) continue; - auto elem = a2m.bone_keys.find(block_id); + auto elem = a2m.bone_keys.find(blk); if (elem == a2m.bone_keys.end()) - elem = a2m.bone_keys.insert({ block_id, {} }).first; + elem = a2m.bone_keys.insert({ blk, {} }).first; vec3 rotation; - mat4_get_rotation_zyx(&data->chain_rot[0], &rotation); + mat4_get_rotation_zyx(&block->chain_rot[0], &rotation); if (elem->second.x.size() == frame) elem->second.x.push_back(rotation.x); if (elem->second.y.size() == frame) @@ -806,8 +829,8 @@ void effchrpv_auth_3d_to_mot::load(int32_t frame) { char buf[0x100]; sprintf_s(buf, sizeof(buf), "PV826_OST_P%d_00", i + 1); uint32_t motion_id = aft_mot_db->get_motion_id(buf); - rob_chara* rob_chr = rob_chara_array_get(rob_chara_ids[i]); - rob_chr->set_motion_id(motion_id, 0.0f, + rob_chara* rob_chr = get_rob_management()->get_rob(rob_ids[i]); + rob_chr->replace_rob_motion(motion_id, 0.0f, 0.0f, false, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); rob_chr->set_motion_reset_data(motion_id, 0.0f); rob_chr->set_motion_skin_param(motion_id, 0.0f); @@ -1040,31 +1063,31 @@ static void mot_write_motion(mot_data_bake_data* bake_data) { return; std::string* bone_name = aft_mot_db->bone_name.data(); - const std::vector* bones = aft_bone_data->get_body_type(BONE_KIND_CMN); - if (!bones) + const std::vector* body_type_table = aft_bone_data->get_body_type_table(BONE_KIND_CMN); + if (!body_type_table) return; prj::shared_ptr& alloc = *bake->alloc; auth_3d_to_mot_data& a2m = *bake_data->data; const mot_bone_info* bone_info = mot_data->bone_info_array; for (size_t key_set_offset = 0, i = 0; key_set_offset < key_set_count; i++) { - BONE_BLK bone_index = (BONE_BLK)aft_bone_data->get_block_index( + BONE_BLK blk = (BONE_BLK)aft_bone_data->get_block_index( BONE_KIND_CMN, bone_name[bone_info[i].index].c_str()); - if (bone_index == -1) { + if (blk == -1) { i++; - bone_index = (BONE_BLK)aft_bone_data->get_block_index( + blk = (BONE_BLK)aft_bone_data->get_block_index( BONE_KIND_CMN, bone_name[bone_info[i].index].c_str()); - if (bone_index == -1) + if (blk == -1) break; } - const BODYTYPE* bone = &(*bones)[bone_index]; + const BODYTYPE* bt = &(*body_type_table)[blk]; - auto elem = a2m.bone_keys.find(bone_index); + auto elem = a2m.bone_keys.find(blk); if (elem != a2m.bone_keys.end()) { auth_3d_to_mot_keys& keys = elem->second; - if (bone->ik_type == IKT_0) { + if (bt->ik_type == IKT_0) { fix_rotation(keys.x); fix_rotation(keys.y); fix_rotation(keys.z); @@ -1098,7 +1121,7 @@ static void mot_write_motion(mot_data_bake_data* bake_data) { key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; } - elem = a2m.sec_bone_keys.find(bone_index); + elem = a2m.sec_bone_keys.find(blk); if (elem != a2m.sec_bone_keys.end()) { auth_3d_to_mot_keys& keys = elem->second; @@ -1134,7 +1157,7 @@ static void mot_write_motion(mot_data_bake_data* bake_data) { key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; } - if (bone_index == BLK_KL_AGO_WJ) { + if (blk == BLK_KL_AGO_WJ) { mot_key_set_data& key_set_data_x = mot_data->key_set_array[key_set_offset]; key_set_data_x.frames = 0; { @@ -1160,7 +1183,7 @@ static void mot_write_motion(mot_data_bake_data* bake_data) { key_set_data_z.keys_count = 0; key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; } - else if (bone_index == BLK_N_KUBI_WJ_EX) { + else if (blk == BLK_N_KUBI_WJ_EX) { mot_key_set_data& key_set_data_x = mot_data->key_set_array[key_set_offset]; key_set_data_x.frames = 0; key_set_data_x.values = 0; @@ -1187,7 +1210,7 @@ static void mot_write_motion(mot_data_bake_data* bake_data) { key_set_data_z.data_type = MOT_KEY_SET_DATA_F32; } - key_set_offset += bone->ik_type >= IKT_ROOT ? 6 : 3; + key_set_offset += bt->ik_type >= IKT_ROOT ? 6 : 3; } bake_data->state = 0; diff --git a/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.hpp b/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.hpp index 07f9357d..801a5aee 100644 --- a/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.hpp +++ b/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.hpp @@ -8,7 +8,7 @@ #include "../../KKdLib/default.hpp" #include -extern void effchrpv_auth_3d_to_mot_init(int32_t pv_id, const int32_t* rob_chara_ids); +extern void effchrpv_auth_3d_to_mot_init(int32_t pv_id, const enum ROB_ID* rob_ids); extern void effchrpv_auth_3d_to_mot_add_chara_effect_auth_3d(uint32_t hash, int32_t id); extern void effchrpv_auth_3d_to_mot_add_file_name(const std::string& file, const std::string& category); extern void effchrpv_auth_3d_to_mot_disp(); diff --git a/src/ReDIVA/data_test/auth_3d_test.cpp b/src/ReDIVA/data_test/auth_3d_test.cpp index 3ab9973c..d1d5c56b 100644 --- a/src/ReDIVA/data_test/auth_3d_test.cpp +++ b/src/ReDIVA/data_test/auth_3d_test.cpp @@ -44,7 +44,7 @@ public: void Hide() override; - void GetCharaCos(CHARA_NUM chara_index, int32_t chara_id, dw::ListBox* list_box); + void GetCharaCos(CHARA_NUM chara_num, int32_t chara_id, dw::ListBox* list_box); }; class Auth3dTestSubWindow : public dw::Shell { @@ -243,7 +243,7 @@ public: dw::Button* play; dw::Button* end; dw::Button* repeat; - dw::Button* left_right_reverse; + dw::Button* mirror; dw::Button* pos; dw::Button* log; dw::Button* snap_shot; @@ -269,7 +269,7 @@ public: SelectionButtonEnd end_listener; SelectionButtonBindBoolFunc pos_listener; SelectionButtonBindBoolFunc repeat_listener; - SelectionButtonBindBoolFunc left_right_reverse_listener; + SelectionButtonBindBoolFunc mirror_listener; SelectionButtonSnapShot snap_shot_listener; SelectionButtonLog log_listener; SelectionButtonShadowType shadow_type_listener; @@ -304,7 +304,6 @@ public: }; extern render_context* rctx_ptr; -extern bool auth_3d_chara_visible; Auth3dTestTask* auth_3d_test_task; Auth3dTestWindow* auth_3d_test_window; @@ -316,8 +315,8 @@ static bool snap_shot; static void auth_3d_test_window_init(); static const char* get_dev_ram_ss_dir(); -Auth3dTestTask::DataEventListener::Data::Data() : state(), field_C(), field_D(), -load_chara_num(), chara_num(), prev_chara_num(), load_cos_id(), cos_id(), chara_visible() { +Auth3dTestTask::DataEventListener::Data::Data() : rob_man(), state(), field_C(), field_D(), +load_chara_num(), chara_num(), prev_chara_num(), load_cos_id(), cos_id(), colli_check_on() { } @@ -346,7 +345,21 @@ void Auth3dTestTask::DataEventListener::Data::ctrl() { } if (field_D) { - free_all_chara(); + rob_man->dest_all(); + + if (prev_chara_num[0] < CN_MAX) { + const RobData* rob_data = get_rob_data(prev_chara_num[0]); + motion_set_unload_motion(rob_data->motfile_auth); + motion_set_unload_mothead(rob_data->motfile_auth); + prev_chara_num[0] = CN_MAX; + } + + if (prev_chara_num[1] < CN_MAX) { + const RobData* rob_data = get_rob_data(prev_chara_num[1]); + motion_set_unload_motion(rob_data->motfile_auth); + motion_set_unload_mothead(rob_data->motfile_auth); + prev_chara_num[1] = CN_MAX; + } field_D = false; } @@ -382,11 +395,10 @@ void Auth3dTestTask::DataEventListener::Data::ctrl() { dtm_eq_vs[0].SetCharaNumCosId(load_chara_num[0], load_cos_id[0]); dtm_eq_vs[1].SetCharaNumCosId(load_chara_num[1], load_cos_id[1]); - if (state == 4) - { - rob_chara_array_set_visibility(0, false); + if (state == 4) { + rob_man->set_disp_on(ROB_ID_1P, false); if (state == 4) - rob_chara_array_set_visibility(1, false); + rob_man->set_disp_on(ROB_ID_2P, false); } } } @@ -395,13 +407,10 @@ void Auth3dTestTask::DataEventListener::Data::dest() { dtm_eq_vs[0].del_task(); dtm_eq_vs[1].del_task(); - auth_3d_chara_visible = chara_visible; + rob_man->set_colli_check_on(colli_check_on); - free_all_chara(); -} - -inline void Auth3dTestTask::DataEventListener::Data::free_all_chara() { - task_rob_manager_free_all_chara(); + rob_man->dest_all(); + rob_man = 0; if (prev_chara_num[0] < CN_MAX) { const RobData* rob_data = get_rob_data(prev_chara_num[0]); @@ -419,8 +428,9 @@ inline void Auth3dTestTask::DataEventListener::Data::free_all_chara() { } void Auth3dTestTask::DataEventListener::Data::init() { - chara_visible = auth_3d_chara_visible; - auth_3d_chara_visible = false; + rob_man = get_rob_management(); + colli_check_on = rob_man->get_colli_check_on(); + rob_man->set_colli_check_on(false); field_C = false; field_D = false; @@ -451,10 +461,10 @@ void Auth3dTestTask::DataEventListener::Data::sub_140244E20() { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - rob_chara_pv_data pv_data; - pv_data.field_4 = false; - rob_chara_array_init_chara_num(load_chara_num[0], pv_data, load_cos_id[0], true); - rob_chara_array_init_chara_num(load_chara_num[1], pv_data, load_cos_id[1], true); + RobInit rob_init; + rob_init.disp = false; + rob_man->create_rob(load_chara_num[0], rob_init, load_cos_id[0], true); + rob_man->create_rob(load_chara_num[1], rob_init, load_cos_id[1], true); if (load_chara_num[0] < CN_MAX) { const RobData* rob_data = get_rob_data(load_chara_num[0]); @@ -473,13 +483,17 @@ void Auth3dTestTask::DataEventListener::Data::sub_140244E20() { state = 1; } -void Auth3dTestTask::DataEventListener::Data::sub_140249A40(bool other_chara) { +void Auth3dTestTask::DataEventListener::Data::sub_140249A40(int32_t rob_id) { if (state != 4) return; - rob_chara_pv_data pv_data; - pv_data.field_4 = false; - auth_3d_check_chara_visible(other_chara, &pv_data); + data_struct* aft_data = &data_list[DATA_AFT]; + bone_database* aft_bone_data = &aft_data->data_ft.bone_data; + motion_database* aft_mot_db = &aft_data->data_ft.mot_db; + + RobInit rob_init; + rob_init.disp = false; + rob_man->reset_rob(rob_id ? ROB_ID_2P : ROB_ID_1P, rob_init, aft_bone_data, aft_mot_db); } Auth3dTestTask::DataEventListener::DataEventListener() { @@ -540,7 +554,7 @@ Auth3dTestTask::Auth3dTestTask() { auth_3d_id = {}; auth_3d_uid = -1; repeat = true; - left_right_reverse = false; + mirror = false; pos = false; snap_shot = false; snap_shot_state = 0; @@ -578,7 +592,7 @@ bool Auth3dTestTask::init() { auth_3d_id = {}; auth_3d_uid = -1; repeat = true; - left_right_reverse = false; + mirror = false; pos = false; snap_shot = false; snap_shot_state = 0; @@ -641,7 +655,7 @@ bool Auth3dTestTask::ctrl() { auth_3d_id.set_enable(true); auth_3d_id.set_paused(false); auth_3d_id.set_repeat(auth_3d_test_task->repeat); - auth_3d_id.set_left_right_reverse(auth_3d_test_task->left_right_reverse); + auth_3d_id.set_mirror(auth_3d_test_task->mirror); auth_3d_id.set_pos(auth_3d_test_task->pos); state = 4; } @@ -727,13 +741,14 @@ void Auth3dTestTask::disp() { } void Auth3dTestTask::DispAuth3dChara(::auth_3d_id& id) { + RobManagement* rob_man = get_rob_management(); id.get_uid(); // ??? - rob_chara_item_equip* rob_disp = rob_chara_array_get_rob_disp(0); + RobDisp* rob_disp = rob_man->get_rob_robdisp_work(ROB_ID_1P); if (!rob_disp) return; for (int32_t i = RPK_ITEM_BEGIN; i <= RPK_ITEM_END; i++) - rob_disp->set_disp((ROB_PARTS_KIND)i, true); + rob_disp->set_disp_flag((ROB_PARTS_KIND)i, true); } void Auth3dTestTask::DispChara() { @@ -1009,17 +1024,18 @@ void Auth3dTestRobWindow::Hide() { SetDisp(); } -void Auth3dTestRobWindow::GetCharaCos(CHARA_NUM chara_index, int32_t chara_id, dw::ListBox* list_box) { +void Auth3dTestRobWindow::GetCharaCos(CHARA_NUM chara_num, int32_t chara_id, dw::ListBox* list_box) { list_box->ClearItems(); - for (const auto& i : item_table_handler_array_get_table(chara_index)->cos) { - if (!i.second.data.outer) + for (const auto& i : get_rob_item_header(chara_num)->defset) { + if (!i.second.item_no[ROB_ITEM_EQUIP_SUB_ID_OUTER]) continue; - const item_table_item* item = item_table_handler_array_get_item(chara_index, i.second.data.outer); - if (item) { + const RobItemTable* tbl = get_rob_item_table(chara_num, + i.second.item_no[ROB_ITEM_EQUIP_SUB_ID_OUTER]); + if (tbl) { char buf[0x100]; - sprintf_s(buf, sizeof(buf), "%03d %s", i.first + 1, item->name.c_str()); + sprintf_s(buf, sizeof(buf), "%03d %s", i.first + 1, tbl->name.c_str()); list_box->AddItem(buf); } } @@ -1453,7 +1469,7 @@ Auth3dTestWindow::Auth3dTestWindow() { const char* nage_text; const char* obj_link_text; - const char* left_right_reverse_text; + const char* mirror_text; const char* snap_shot_text; const char* self_shadow_off_text; const char* black_mask_text; @@ -1461,7 +1477,7 @@ Auth3dTestWindow::Auth3dTestWindow() { if (dw::translate) { nage_text = u8"NAGE▽"; obj_link_text = u8"OBJ Link"; - left_right_reverse_text = u8"Left Right Reverse"; + mirror_text = u8"Mirror"; snap_shot_text = u8"ss capture"; self_shadow_off_text = u8"Self Shadow Off"; black_mask_text = u8"Black Mask"; @@ -1470,7 +1486,7 @@ Auth3dTestWindow::Auth3dTestWindow() { else { nage_text = u8"投▽"; obj_link_text = u8"OBJ連動"; - left_right_reverse_text = u8"左右逆"; + mirror_text = u8"左右逆"; snap_shot_text = u8"ss画撮"; self_shadow_off_text = u8"セルフ影OFF"; black_mask_text = u8"黒mask"; @@ -1584,11 +1600,11 @@ Auth3dTestWindow::Auth3dTestWindow() { repeat_listener.callback = Auth3dTestWindow::RepeatCallback; repeat->AddSelectionListener(&repeat_listener); - left_right_reverse = new dw::Button(this, dw::CHECKBOX); - left_right_reverse->SetText(left_right_reverse_text); - left_right_reverse->SetValue(auth_3d_test_task->left_right_reverse); - left_right_reverse_listener.callback = Auth3dTestWindow::LeftRightReverseCallback; - left_right_reverse->AddSelectionListener(&left_right_reverse_listener); + mirror = new dw::Button(this, dw::CHECKBOX); + mirror->SetText(mirror_text); + mirror->SetValue(auth_3d_test_task->mirror); + mirror_listener.callback = Auth3dTestWindow::LeftRightReverseCallback; + mirror->AddSelectionListener(&mirror_listener); dw::Composite* v79 = new dw::Composite(this); v79->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); @@ -1770,10 +1786,10 @@ void Auth3dTestWindow::CategoryCharaMenuInit(dw::Button* button, dw::Menu*& menu } void Auth3dTestWindow::LeftRightReverseCallback(bool value) { - auth_3d_test_task->left_right_reverse = value; + auth_3d_test_task->mirror = value; if (auth_3d_test_task->auth_3d_id.check_not_empty()) { auth_3d_test_task->auth_3d_id.set_req_frame(0.0f); - auth_3d_test_task->auth_3d_id.set_left_right_reverse(value); + auth_3d_test_task->auth_3d_id.set_mirror(value); } } diff --git a/src/ReDIVA/data_test/auth_3d_test.hpp b/src/ReDIVA/data_test/auth_3d_test.hpp index d992b378..2b6091c9 100644 --- a/src/ReDIVA/data_test/auth_3d_test.hpp +++ b/src/ReDIVA/data_test/auth_3d_test.hpp @@ -8,6 +8,7 @@ #include #include "../../KKdLib/default.hpp" #include "../../KKdLib/database/item_table.hpp" +#include "../../CRE/rob/rob.hpp" #include "../../CRE/auth_3d.hpp" #include "../../CRE/task.hpp" #include "equip_test.hpp" @@ -17,6 +18,7 @@ public: class DataEventListener : public a3d::EventAdapter { public: struct Data { + RobManagement* rob_man; int32_t state; bool field_C; bool field_D; @@ -26,18 +28,17 @@ public: int32_t load_cos_id[2]; int32_t cos_id[2]; DtmEqVs dtm_eq_vs[2]; - bool chara_visible; + bool colli_check_on; Data(); ~Data(); void ctrl(); void dest(); - void free_all_chara(); void init(); void sub_140244E20(); - void sub_140249A40(bool other_chara); + void sub_140249A40(int32_t rob_id); }; Data data; @@ -58,7 +59,7 @@ public: ::auth_3d_id auth_3d_id; int32_t auth_3d_uid; bool repeat; - bool left_right_reverse; + bool mirror; bool pos; bool snap_shot; int32_t snap_shot_state; diff --git a/src/ReDIVA/data_test/equip_test.cpp b/src/ReDIVA/data_test/equip_test.cpp index c6ab1371..f733915f 100644 --- a/src/ReDIVA/data_test/equip_test.cpp +++ b/src/ReDIVA/data_test/equip_test.cpp @@ -19,12 +19,12 @@ public: bool set_item_no; bool reset_item_no; bool refresh; - int32_t item_no; - const item_cos_data* cos; - CHARA_NUM chara_num; - int32_t cos_id; + uint32_t item_no; + const RobItemEquip* item_set; + CHARA_NUM cn; + int32_t cs; bool update_item; - int32_t disp_parts; + int32_t dp; std::vector items[DATA_TEST_ITEM_EQUIP_MAX]; std::map field_278[DATA_TEST_ITEM_EQUIP_MAX]; int32_t current_items[DATA_TEST_ITEM_EQUIP_MAX]; @@ -42,7 +42,7 @@ public: Item(); }; - int32_t chara_id; + int32_t rc; Data data[ROB_ID_MAX]; Item item; @@ -51,38 +51,38 @@ public: virtual void Hide() override; - void DataReset(int32_t chara_id); + void DataReset(int32_t rc); int32_t GetCharaID(); - CHARA_NUM GetCharaNum(int32_t chara_id); - const item_cos_data* GetCos(int32_t chara_id); - int32_t GetCosId(int32_t chara_id); - int32_t GetCurrentCharaItem(int32_t chara_id, dw::Widget* data); - int32_t GetDispParts(int32_t chara_id); - int32_t GetItemNo(int32_t chara_id); - bool GetRefresh(int32_t chara_id); - bool GetResetItemNo(int32_t chara_id); - bool GetSetItemNo(int32_t chara_id); - int32_t GetSelectedCharaItemNo(int32_t chara_id, dw::Widget* data); + CHARA_NUM GetCharaNum(int32_t rc); + int32_t GetCosId(int32_t rc); + int32_t GetCurrentCharaItem(int32_t rc, dw::Widget* data); + int32_t GetDispParts(int32_t rc); + const RobItemEquip* GetEquip(int32_t rc); + int32_t GetItemNo(int32_t rc); + bool GetRefresh(int32_t rc); + bool GetResetItemNo(int32_t rc); + bool GetSetItemNo(int32_t rc); + int32_t GetSelectedCharaItemNo(int32_t rc, dw::Widget* data); bool IsEquipAllowed(int32_t equip); void ItemReset(); - void ResetCharaItemCos(int32_t chara_id); - void SetCharaDisp(int32_t chara_id, bool value); + void ResetCharaItemCos(int32_t rc); + void SetCharaDisp(int32_t rc, bool value); void SetCharaID(int32_t value); - void SetCharaItemCos(int32_t chara_id, const item_cos_data* cos); - void SetCharaNum(int32_t chara_id, CHARA_NUM chara_num); - void SetCos(int32_t chara_id, const item_cos_data* cos); - void SetCosId(int32_t chara_id, int32_t cos_id); - void SetCurrentItemNo(int32_t chara_id, dw::Widget* data, int32_t value); - void SetDispParts(int32_t chara_id, int32_t parts); - void SetItemNo(int32_t chara_id, int32_t value); - void SetRefresh(int32_t chara_id, bool value); - void SetResetItemNo(int32_t chara_id, bool value); - void SetSetItemNo(int32_t chara_id, bool value); - void SetUpdateItem(int32_t chara_id, bool value); + void SetCharaItemEquip(int32_t rc, const RobItemEquip* item_set); + void SetCharaNum(int32_t rc, CHARA_NUM cn); + void SetCosId(int32_t rc, int32_t cs); + void SetCurrentItemNo(int32_t rc, dw::Widget* data, int32_t value); + void SetDispParts(int32_t rc, int32_t parts); + void SetEquip(int32_t rc, const RobItemEquip* item_set); + void SetItemNo(int32_t rc, int32_t value); + void SetRefresh(int32_t rc, bool value); + void SetResetItemNo(int32_t rc, bool value); + void SetSetItemNo(int32_t rc, bool value); + void SetUpdateItem(int32_t rc, bool value); static void Disp1pCallback(dw::Widget* data); static void Disp2pCallback(dw::Widget* data); - static void DispCallback(int32_t chara_id, dw::Widget* widget); + static void DispCallback(int32_t rc, dw::Widget* widget); static void DispPartsCallback(dw::Widget* data); static void ExclusiveCheckCallback(dw::Widget* widget); static void ItemCallback(dw::Widget* data); @@ -90,20 +90,24 @@ public: static void RefreshCallback(dw::Widget* data); static void RobCallback(dw::Widget* data); - void sub_14025FD80(int32_t chara_id); + void sub_14025FD80(int32_t rc); - void sub_140261520(int32_t chara_id); - void sub_140261580(int32_t chara_id); - void sub_140261AF0(int32_t chara_id); - void sub_140261C40(int32_t chara_id); + void sub_140261520(int32_t rc); + void sub_140261580(int32_t rc); + void sub_140261AF0(int32_t rc); + void sub_140261C40(int32_t rc); }; -static const item_sub_id data_test_equip_sub_ids[] = { - ITEM_SUB_ZUJO, ITEM_SUB_KAMI, ITEM_SUB_HITAI, ITEM_SUB_ME, ITEM_SUB_MEGANE, - ITEM_SUB_MIMI, ITEM_SUB_KUCHI, ITEM_SUB_MAKI, ITEM_SUB_KUBI, ITEM_SUB_INNER, - ITEM_SUB_OUTER, ITEM_SUB_KATA, ITEM_SUB_U_UDE, ITEM_SUB_L_UDE, ITEM_SUB_TE, - ITEM_SUB_JOHA_MAE, ITEM_SUB_JOHA_USHIRO, ITEM_SUB_BELT, ITEM_SUB_KOSI, ITEM_SUB_PANTS, - ITEM_SUB_ASI, ITEM_SUB_SUNE, ITEM_SUB_KUTSU, ITEM_SUB_HADA, ITEM_SUB_HEAD, +static const ROB_ITEM_EQUIP_SUB_ID data_test_equip_sub_ids[] = { + ROB_ITEM_EQUIP_SUB_ID_ZUJO, ROB_ITEM_EQUIP_SUB_ID_KAMI, ROB_ITEM_EQUIP_SUB_ID_HITAI, + ROB_ITEM_EQUIP_SUB_ID_ME, ROB_ITEM_EQUIP_SUB_ID_MEGANE, ROB_ITEM_EQUIP_SUB_ID_MIMI, + ROB_ITEM_EQUIP_SUB_ID_KUCHI, ROB_ITEM_EQUIP_SUB_ID_MAKI, ROB_ITEM_EQUIP_SUB_ID_KUBI, + ROB_ITEM_EQUIP_SUB_ID_INNER, ROB_ITEM_EQUIP_SUB_ID_OUTER, ROB_ITEM_EQUIP_SUB_ID_KATA, + ROB_ITEM_EQUIP_SUB_ID_U_UDE, ROB_ITEM_EQUIP_SUB_ID_L_UDE, ROB_ITEM_EQUIP_SUB_ID_TE, + ROB_ITEM_EQUIP_SUB_ID_JOHA_MAE, ROB_ITEM_EQUIP_SUB_ID_JOHA_USHIRO, ROB_ITEM_EQUIP_SUB_ID_BELT, + ROB_ITEM_EQUIP_SUB_ID_KOSI, ROB_ITEM_EQUIP_SUB_ID_PANTS, ROB_ITEM_EQUIP_SUB_ID_ASI, + ROB_ITEM_EQUIP_SUB_ID_SUNE, ROB_ITEM_EQUIP_SUB_ID_KUTSU, ROB_ITEM_EQUIP_SUB_ID_HADA, + ROB_ITEM_EQUIP_SUB_ID_HEAD, }; extern render_context* rctx_ptr; @@ -112,38 +116,21 @@ DtmEqVs* dtm_eq_vs_array; DataTestEquipDw* data_test_equip_dw; -int32_t data_test_item_array_load_count; -std::vector data_test_item_array[CN_MAX][ITEM_SUB_MAX]; - -int32_t data_test_item_equip_array_load_count; -std::vector data_test_item_equip_array[CN_MAX][5]; - CHARA_NUM data_test_equip_dw_chara_index_array[ROB_ID_MAX]; -static int32_t data_test_equip_dw_get_disp_parts(int32_t chara_id); -static void data_test_equip_dw_set_chara_num(int32_t chara_id, CHARA_NUM chara_num); -static void data_test_equip_dw_set_chara_item_cos(int32_t chara_id, const item_cos_data* cos); -static const item_cos_data* data_test_equip_dw_get_cos(int32_t chara_id); -static int32_t data_test_equip_dw_get_item_no(int32_t chara_id); -static bool data_test_equip_dw_get_reset_item_no(int32_t chara_id); -static bool data_test_equip_dw_get_set_item_no(int32_t chara_id); -static void data_test_equip_dw_reset_chara_item_cos(int32_t chara_id); -static void data_test_equip_dw_set_cos_id(int32_t chara_id, int32_t cos); -static void data_test_equip_dw_sub_140261520(int32_t chara_id); +static int32_t data_test_equip_dw_get_disp_parts(int32_t rc); +static void data_test_equip_dw_set_chara_num(int32_t rc, CHARA_NUM cn); +static void data_test_equip_dw_set_chara_item_equip(int32_t rc, const RobItemEquip* item_set); +static const RobItemEquip* data_test_equip_dw_get_equip(int32_t rc); +static int32_t data_test_equip_dw_get_item_no(int32_t rc); +static bool data_test_equip_dw_get_reset_item_no(int32_t rc); +static bool data_test_equip_dw_get_set_item_no(int32_t rc); +static void data_test_equip_dw_reset_chara_item_cos(int32_t rc); +static void data_test_equip_dw_set_cos_id(int32_t rc, int32_t cos); +static void data_test_equip_dw_sub_140261520(int32_t rc); -static std::vector* data_test_item_array_get(CHARA_NUM chara_num); -static void data_test_item_array_load(); -static void data_test_item_array_unload(); - -static std::vector* data_test_item_equip_array_get(CHARA_NUM chara_num); -static void data_test_item_equip_array_load(); -static void data_test_item_equip_array_unload(); - -static int32_t data_test_item_get_item_equip(CHARA_NUM chara_num, int32_t item_no); - -DtmEqVs::DtmEqVs() : chara_id(), chara_num(), -curr_chara_num(), cos_id(), curr_cos_id(), disp_parts() { - state = -1; +DtmEqVs::DtmEqVs() : m_rc(), m_cn_cur(), m_cn_pre(), m_cs_cur(), m_cs_pre(), m_dp() { + m_mode = -1; } DtmEqVs::~DtmEqVs() { @@ -151,79 +138,80 @@ DtmEqVs::~DtmEqVs() { } bool DtmEqVs::init() { - state = 0; + m_mode = 0; return true; } bool DtmEqVs::ctrl() { - rob_chara_item_cos_data* item_cos_data = rob_chara_array_get_item_cos_data(chara_id); - rob_chara* rob_chr = rob_chara_array_get(chara_id); - switch (state) { + RobManagement* rob_man = get_rob_management(); + RobItem* rob_item = rob_man->get_rob_robitem_work((ROB_ID)m_rc); + rob_chara* rob_chr = rob_man->get_rob((ROB_ID)m_rc); + switch (m_mode) { case 0: - data_test_equip_dw_sub_140261520(chara_id); - data_test_equip_dw_set_chara_item_cos(chara_id, item_cos_data->get_cos()); - state = 3; + data_test_equip_dw_sub_140261520(m_rc); + data_test_equip_dw_set_chara_item_equip(m_rc, rob_item->get_equip()); + m_mode = 3; case 3: if (dtm_mot_array_get_loaded()) { CtrlDispParts(); CtrlChara(); - int32_t item_no = data_test_equip_dw_get_item_no(chara_id); - ::item_cos_data temp_cos; + uint32_t item_no = data_test_equip_dw_get_item_no(m_rc); + RobItemEquip temp_equip; if (rob_chr) - temp_cos = *rob_chr->item_cos_data.get_cos(); + temp_equip = *rob_chr->item.get_equip(); bool reload = false; - if (data_test_equip_dw_get_set_item_no(chara_id)) { - item_cos_data->set_chara_num_item(chara_num, item_no); + if (data_test_equip_dw_get_set_item_no(m_rc)) { + RobItem::s_regist_item_one((CHARA_NUM)m_cn_cur, item_no, rob_item); reload = true; } - if (data_test_equip_dw_get_reset_item_no(chara_id)) { - item_cos_data->set_chara_num_item_zero(chara_num, item_no); + if (data_test_equip_dw_get_reset_item_no(m_rc)) { + RobItem::s_delete_item((CHARA_NUM)m_cn_cur, item_no, rob_item); reload = true; } - const ::item_cos_data* cos = data_test_equip_dw_get_cos(chara_id); - if (cos) { - item_cos_data->set_chara_num_item_nos(chara_num, cos->arr); + const RobItemEquip* item_set = data_test_equip_dw_get_equip(m_rc); + if (item_set) { + RobItem::s_regist_item_all((CHARA_NUM)m_cn_cur, item_set, rob_item); reload = true; } - /*if (sub_1402CEEC0(chara_id)) { + /*if (sub_1402CEEC0(rc)) { reload = true; sub_1402CF8F0(); }*/ - data_test_equip_dw_reset_chara_item_cos(chara_id); + data_test_equip_dw_reset_chara_item_cos(m_rc); if (reload) { if (rob_chr) - task_rob_load_append_free_req_data_obj(rob_chr->chara_num, &temp_cos); - rob_chara_array_reset_bone_data_item_equip(chara_id); + task_rob_load_append_free_req_data_obj(rob_chr->chara_num, &temp_equip); + rob_chara_array_reset_bone_data_item_equip((ROB_ID)m_rc); task_rob_manager_hide_task(); - state = 1; + m_mode = 1; } } break; case 1: if (rob_chr) { - task_rob_load_append_load_req_data_obj(rob_chr->chara_num, rob_chr->item_cos_data.get_cos()); - state = 2; + task_rob_load_append_load_req_data_obj(rob_chr->chara_num, rob_chr->item.get_equip()); + m_mode = 2; } break; case 2: if (!task_rob_load_check_load_req_data()) { task_rob_manager_run_task(); - if (rob_chara_array_get(chara_id)) { + if (get_rob_management()->get_rob((ROB_ID)m_rc)) { data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - item_cos_data->reload_items(chara_id, aft_bone_data, aft_data, aft_obj_db); + rob_item->equip(m_rc, aft_bone_data, aft_data, aft_obj_db); } auth_3d_test_task_disp_chara(); dtm_mot_array_set_reset_mot(); - state = 3; + m_mode = 3; } break; } @@ -234,15 +222,15 @@ bool DtmEqVs::dest() { return true; } -bool DtmEqVs::add_task(int32_t chara_id, CHARA_NUM chara_num) { - this->chara_id = chara_id; - this->chara_num = chara_num; - this->curr_chara_num = chara_num; - cos_id = 0; - curr_cos_id = 0; - disp_parts = 0; - data_test_equip_dw_set_chara_num(chara_id, chara_num); - data_test_equip_dw_set_cos_id(chara_id, cos_id); +bool DtmEqVs::add_task(int32_t rc, int32_t cn) { + m_rc = rc; + m_cn_cur = cn; + m_cn_pre = cn; + m_cs_cur = 0; + m_cs_pre = 0; + m_dp = 0; + data_test_equip_dw_set_chara_num(rc, (CHARA_NUM)cn); + data_test_equip_dw_set_cos_id(rc, m_cs_cur); return app::TaskWork::add_task(this, "DATA TEST EQUIP MANAGER FOR VS"); } @@ -250,35 +238,35 @@ bool DtmEqVs::del_task() { return app::Task::del(); } -void DtmEqVs::SetCharaNumCosId(CHARA_NUM chara_num, int32_t cos_id) { - this->chara_num = chara_num; - this->cos_id = cos_id; - data_test_equip_dw_set_chara_num(chara_id, chara_num); - data_test_equip_dw_set_cos_id(chara_id, cos_id); +void DtmEqVs::SetCharaNumCosId(int32_t cn, int32_t cs) { + m_cn_cur = cn; + m_cs_cur = cs; + data_test_equip_dw_set_chara_num(m_rc, (CHARA_NUM)cn); + data_test_equip_dw_set_cos_id(m_rc, m_cs_cur); } void DtmEqVs::CtrlChara() { - if (chara_num == curr_chara_num && cos_id == curr_cos_id) + if (m_cn_cur == m_cn_pre && m_cs_cur == m_cs_pre) return; - curr_chara_num = chara_num; - curr_cos_id = cos_id; - const item_cos_data* cos = item_table_handler_array_get_item_cos_data(chara_num, cos_id); - if (!check_cos_id_is_501(curr_cos_id) || !cos) { - data_test_equip_dw_sub_140261520(chara_id); - data_test_equip_dw_set_chara_item_cos(chara_id, cos); + m_cn_pre = m_cn_cur; + m_cs_pre = m_cs_cur; + const RobItemEquip* item_set = get_default_costume_data((CHARA_NUM)m_cn_cur, m_cs_cur); + if (!check_cos_id_is_501(m_cs_pre) || !item_set) { + data_test_equip_dw_sub_140261520(m_rc); + data_test_equip_dw_set_chara_item_equip(m_rc, item_set); } } void DtmEqVs::CtrlDispParts() { - int32_t disp_parts = data_test_equip_dw_get_disp_parts(chara_id); - if (this->disp_parts == disp_parts) + int32_t dp = data_test_equip_dw_get_disp_parts(m_rc); + if (m_dp == dp) return; - rob_chara_item_equip* rob_disp = rob_chara_array_get_rob_disp(chara_id); + RobDisp* rob_disp = get_rob_management()->get_rob_robdisp_work((ROB_ID)m_rc); bool disp = false; ROB_PARTS_KIND rpk; - switch (disp_parts) { + switch (dp) { default: rpk = RPK_NONE; disp = true; @@ -295,14 +283,14 @@ void DtmEqVs::CtrlDispParts() { } for (int32_t i = RPK_DISP_BEGIN; i <= RPK_DISP_END; i++) - if (rob_disp->get_object_info((ROB_PARTS_KIND)i).not_null()) - rob_disp->set_disp((ROB_PARTS_KIND)i, true); + if (rob_disp->get_objid((ROB_PARTS_KIND)i).not_null()) + rob_disp->set_disp_flag((ROB_PARTS_KIND)i, true); for (int32_t i = RPK_DISP_BEGIN; i <= RPK_DISP_END; i++) if (i != rpk && (!disp || i != rob_disp->hyoutan_rpk)) - rob_disp->set_disp((ROB_PARTS_KIND)i, disp); + rob_disp->set_disp_flag((ROB_PARTS_KIND)i, disp); - this->disp_parts = disp_parts; + m_dp = dp; } void equip_test_init() { @@ -317,8 +305,8 @@ void equip_test_free() { } } -DataTestEquipDw::Data::Data() : disp(), set_item_no(), reset_item_no(), refresh(), item_no(), -cos(), chara_num(), cos_id(), update_item(), disp_parts(), current_items() { +DataTestEquipDw::Data::Data() : disp(), set_item_no(), reset_item_no(), refresh(), +item_no(), item_set(), cn(), cs(), update_item(), dp(), current_items() { } @@ -330,15 +318,15 @@ DataTestEquipDw::Item::Item() : comp(), label(), list_box(), parts() { } -DataTestEquipDw::DataTestEquipDw() : chara_id() { +DataTestEquipDw::DataTestEquipDw() : rc() { ItemReset(); for (int32_t i = 0; i < ROB_ID_MAX; i++) { DataReset(i); - data[i].chara_num = data_test_equip_dw_chara_index_array[i]; + data[i].cn = data_test_equip_dw_chara_index_array[i]; } - data_test_item_array_load(); + RobItem::init_have_dbg(); const char* exclusive_check_text; if (dw::translate) @@ -442,11 +430,11 @@ DataTestEquipDw::DataTestEquipDw() : chara_id() { j++; } - sub_140261520(0); - SetCharaItemCos(0, &rob_chara_array_get_item_cos_data(0)->cos); - - sub_140261520(1); - SetCharaItemCos(1, &rob_chara_array_get_item_cos_data(1)->cos); + for (int32_t i = 0; i <= ROB_ID_2P; i++) { + ROB_ID rob_id = (ROB_ID)i; + sub_140261520(rob_id); + SetCharaItemEquip(rob_id, get_rob_management()->get_rob_robitem_work(rob_id)->get_equip()); + } rect.pos = { 953.0f, 0.0f }; } @@ -461,19 +449,19 @@ void DataTestEquipDw::Hide() { for (DataTestEquipDw::Data& i : data) i.update_item = false; - data_test_item_equip_array_unload(); + RobItem::dest_have_dbg(); } -void DataTestEquipDw::DataReset(int32_t chara_id) { - DataTestEquipDw::Data& data = this->data[chara_id]; +void DataTestEquipDw::DataReset(int32_t rc) { + DataTestEquipDw::Data& data = this->data[rc]; data.disp = true; data.set_item_no = false; data.reset_item_no = false; data.refresh = false; data.item_no = 0; - data.chara_num = CN_MIKU; + data.cn = CN_MIKU; data.update_item = false; - data.disp_parts = 0; + data.dp = 0; for (int32_t i = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { data.items[i].clear(); @@ -486,50 +474,50 @@ void DataTestEquipDw::DataReset(int32_t chara_id) { } int32_t DataTestEquipDw::GetCharaID() { - return chara_id; + return rc; } -CHARA_NUM DataTestEquipDw::GetCharaNum(int32_t chara_id) { - return data[chara_id].chara_num; +CHARA_NUM DataTestEquipDw::GetCharaNum(int32_t rc) { + return data[rc].cn; } -const item_cos_data* DataTestEquipDw::GetCos(int32_t chara_id) { - return data[chara_id].cos; +int32_t DataTestEquipDw::GetCosId(int32_t rc) { + return data[rc].cs; } -int32_t DataTestEquipDw::GetCosId(int32_t chara_id) { - return data[chara_id].cos_id; +int32_t DataTestEquipDw::GetCurrentCharaItem(int32_t rc, dw::Widget* data) { + return this->data[rc].current_items[data->callback_data.i32]; } -int32_t DataTestEquipDw::GetCurrentCharaItem(int32_t chara_id, dw::Widget* data) { - return this->data[chara_id].current_items[data->callback_data.i32]; +int32_t DataTestEquipDw::GetDispParts(int32_t rc) { + return data[rc].dp; } -int32_t DataTestEquipDw::GetDispParts(int32_t chara_id) { - return data[chara_id].disp_parts; +const RobItemEquip* DataTestEquipDw::GetEquip(int32_t rc) { + return data[rc].item_set; } -int32_t DataTestEquipDw::GetItemNo(int32_t chara_id) { - return data[chara_id].item_no; +int32_t DataTestEquipDw::GetItemNo(int32_t rc) { + return data[rc].item_no; } -bool DataTestEquipDw::GetRefresh(int32_t chara_id) { - return data[chara_id].refresh; +bool DataTestEquipDw::GetRefresh(int32_t rc) { + return data[rc].refresh; } -bool DataTestEquipDw::GetResetItemNo(int32_t chara_id) { - return data[chara_id].reset_item_no; +bool DataTestEquipDw::GetResetItemNo(int32_t rc) { + return data[rc].reset_item_no; } -int32_t DataTestEquipDw::GetSelectedCharaItemNo(int32_t chara_id, dw::Widget* data) { +int32_t DataTestEquipDw::GetSelectedCharaItemNo(int32_t rc, dw::Widget* data) { dw::ListBox* list_box = dynamic_cast(data); if (list_box) - return this->data[chara_id].items[data->callback_data.i32][list_box->list->selected_item]; + return this->data[rc].items[data->callback_data.i32][list_box->list->selected_item]; return 0; } -bool DataTestEquipDw::GetSetItemNo(int32_t chara_id) { - return data[chara_id].set_item_no; +bool DataTestEquipDw::GetSetItemNo(int32_t rc) { + return data[rc].set_item_no; } bool DataTestEquipDw::IsEquipAllowed(int32_t equip) { @@ -553,84 +541,84 @@ void DataTestEquipDw::ItemReset() { item.parts = 0; } -void DataTestEquipDw::ResetCharaItemCos(int32_t chara_id) { - data[chara_id].set_item_no = false; - data[chara_id].reset_item_no = false; - data[chara_id].item_no = 0; - data[chara_id].cos = 0; +void DataTestEquipDw::ResetCharaItemCos(int32_t rc) { + data[rc].set_item_no = false; + data[rc].reset_item_no = false; + data[rc].item_no = 0; + data[rc].item_set = 0; } -void DataTestEquipDw::SetCharaDisp(int32_t chara_id, bool value) { - data[chara_id].disp = value; - data[chara_id].disp_parts = value ? 0 : 1; +void DataTestEquipDw::SetCharaDisp(int32_t rc, bool value) { + data[rc].disp = value; + data[rc].dp = value ? 0 : 1; } void DataTestEquipDw::SetCharaID(int32_t value) { - chara_id = value; + rc = value; } -void DataTestEquipDw::SetCharaItemCos(int32_t chara_id, const item_cos_data* cos) { - if (!cos) +void DataTestEquipDw::SetCharaItemEquip(int32_t rc, const RobItemEquip* item_set) { + if (!item_set) return; - DataTestEquipDw::Data& data = this->data[chara_id]; + DataTestEquipDw::Data& data = this->data[rc]; for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { if (!IsEquipAllowed(i)) continue; - if (this->chara_id == chara_id) { - auto elem = data.field_278[j].find(cos->arr[data_test_equip_sub_ids[i]]); + if (this->rc == rc) { + auto elem = data.field_278[j].find(item_set->item_no[data_test_equip_sub_ids[i]]); if (elem != data.field_278[j].end() && elem->second) item.list_box[j]->SetItemIndex(elem->second); else item.list_box[j]->SetItemIndex(-1); } - data.current_items[j] = cos->arr[data_test_equip_sub_ids[i]]; + data.current_items[j] = item_set->item_no[data_test_equip_sub_ids[i]]; j++; } } -void DataTestEquipDw::SetCharaNum(int32_t chara_id, CHARA_NUM chara_num) { - data[chara_id].chara_num = chara_num; +void DataTestEquipDw::SetCharaNum(int32_t rc, CHARA_NUM cn) { + data[rc].cn = cn; } -void DataTestEquipDw::SetCos(int32_t chara_id, const item_cos_data* cos) { - data[chara_id].cos = cos; +void DataTestEquipDw::SetCosId(int32_t rc, int32_t cs) { + data[rc].cs = cs; } -void DataTestEquipDw::SetCosId(int32_t chara_id, int32_t cos_id) { - data[chara_id].cos_id = cos_id; +void DataTestEquipDw::SetCurrentItemNo(int32_t rc, dw::Widget* data, int32_t value) { + this->data[rc].current_items[data->callback_data.i32] = value; } -void DataTestEquipDw::SetCurrentItemNo(int32_t chara_id, dw::Widget* data, int32_t value) { - this->data[chara_id].current_items[data->callback_data.i32] = value; +void DataTestEquipDw::SetDispParts(int32_t rc, int32_t parts) { + if (data[rc].disp) + data[rc].dp = parts; } -void DataTestEquipDw::SetDispParts(int32_t chara_id, int32_t parts) { - if (data[chara_id].disp) - data[chara_id].disp_parts = parts; +void DataTestEquipDw::SetEquip(int32_t rc, const RobItemEquip* item_set) { + data[rc].item_set = item_set; } -void DataTestEquipDw::SetItemNo(int32_t chara_id, int32_t value) { - data[chara_id].item_no = value; +void DataTestEquipDw::SetItemNo(int32_t rc, int32_t value) { + data[rc].item_no = value; } -void DataTestEquipDw::SetRefresh(int32_t chara_id, bool value) { - data[chara_id].refresh = value; +void DataTestEquipDw::SetRefresh(int32_t rc, bool value) { + data[rc].refresh = value; } -void DataTestEquipDw::SetResetItemNo(int32_t chara_id, bool value) { - data[chara_id].reset_item_no = value; +void DataTestEquipDw::SetResetItemNo(int32_t rc, bool value) { + data[rc].reset_item_no = value; } -void DataTestEquipDw::SetSetItemNo(int32_t chara_id, bool value) { - data[chara_id].set_item_no = value; +void DataTestEquipDw::SetSetItemNo(int32_t rc, bool value) { + data[rc].set_item_no = value; } -void DataTestEquipDw::SetUpdateItem(int32_t chara_id, bool value) { - data[chara_id].update_item = value; +void DataTestEquipDw::SetUpdateItem(int32_t rc, bool value) { + data[rc].update_item = value; } void DataTestEquipDw::Disp1pCallback(dw::Widget* data) { @@ -641,10 +629,10 @@ void DataTestEquipDw::Disp2pCallback(dw::Widget* data) { DispCallback(1, data); } -void DataTestEquipDw::DispCallback(int32_t chara_id, dw::Widget* data) { +void DataTestEquipDw::DispCallback(int32_t rc, dw::Widget* data) { dw::Button* button = dynamic_cast(data); if (button) - data_test_equip_dw->SetCharaDisp(chara_id, button->value); + data_test_equip_dw->SetCharaDisp(rc, button->value); } void DataTestEquipDw::DispPartsCallback(dw::Widget* data) { @@ -660,27 +648,27 @@ void DataTestEquipDw::ExclusiveCheckCallback(dw::Widget* data) { } void DataTestEquipDw::ItemCallback(dw::Widget* data) { - int32_t chara_id = data_test_equip_dw->GetCharaID(); - int32_t item_no = data_test_equip_dw->GetSelectedCharaItemNo(chara_id, data); - int32_t curr_item_no = data_test_equip_dw->GetCurrentCharaItem(chara_id, data); + int32_t rc = data_test_equip_dw->GetCharaID(); + uint32_t item_no = data_test_equip_dw->GetSelectedCharaItemNo(rc, data); + int32_t curr_item_no = data_test_equip_dw->GetCurrentCharaItem(rc, data); if (item_no) { - data_test_equip_dw->SetSetItemNo(chara_id, true); - data_test_equip_dw->SetResetItemNo(chara_id, false); - data_test_equip_dw->SetUpdateItem(chara_id, true); - data_test_equip_dw->SetItemNo(chara_id, item_no); - data_test_equip_dw->SetCurrentItemNo(chara_id, data, item_no); + data_test_equip_dw->SetSetItemNo(rc, true); + data_test_equip_dw->SetResetItemNo(rc, false); + data_test_equip_dw->SetUpdateItem(rc, true); + data_test_equip_dw->SetItemNo(rc, item_no); + data_test_equip_dw->SetCurrentItemNo(rc, data, item_no); } else if (curr_item_no) { - data_test_equip_dw->SetSetItemNo(chara_id, false); - data_test_equip_dw->SetResetItemNo(chara_id, true); - data_test_equip_dw->SetUpdateItem(chara_id, true); - data_test_equip_dw->SetItemNo(chara_id, curr_item_no); - data_test_equip_dw->SetCurrentItemNo(chara_id, data, curr_item_no); + data_test_equip_dw->SetSetItemNo(rc, false); + data_test_equip_dw->SetResetItemNo(rc, true); + data_test_equip_dw->SetUpdateItem(rc, true); + data_test_equip_dw->SetItemNo(rc, curr_item_no); + data_test_equip_dw->SetCurrentItemNo(rc, data, curr_item_no); } else{ - data_test_equip_dw->SetItemNo(chara_id, item_no); - data_test_equip_dw->SetCurrentItemNo(chara_id, data, item_no); + data_test_equip_dw->SetItemNo(rc, item_no); + data_test_equip_dw->SetCurrentItemNo(rc, data, item_no); } } @@ -690,67 +678,67 @@ void DataTestEquipDw::PartsCallback(dw::Widget* data) { if (!list_box) return; - int32_t chara_id = data_test_equip_dw->GetCharaID(); - CHARA_NUM chara_num = data_test_equip_dw->GetCharaNum(chara_id); - int32_t cos = data_test_equip_dw->GetCosId(chara_id); + int32_t rc = data_test_equip_dw->GetCharaID(); + CHARA_NUM cn = data_test_equip_dw->GetCharaNum(rc); + int32_t cos = data_test_equip_dw->GetCosId(rc); - const item_cos_data* v9 = item_table_handler_array_get_item_cos_data(chara_num, cos); + const RobItemEquip* item_set = get_default_costume_data(cn, cos); size_t selected_item = list_box->list->selected_item; switch (selected_item) { case 0: break; case 1: - v9 = item_table_handler_array_get_item_cos_data(chara_num, 499); + item_set = get_default_costume_data(cn, 499); break; case 2: default: { - auto& dbgset = item_table_handler_array_get_table(chara_num)->dbgset; - auto elem = dbgset.find(list_box->GetItemStr(selected_item).c_str()); - if (elem != dbgset.end()) - v9 = &elem->second; + const RobItemDbgSet* dbgset = RobItem::get_dbgset(cn); + auto elem = dbgset->find(list_box->GetItemStr(selected_item).c_str()); + if (elem != dbgset->end()) + item_set = &elem->second; } break; } - item_cos_data* v23 = &rob_chara_array_get_item_cos_data(chara_id)->cos; - if (selected_item >= 2 && data_test_equip_dw->GetRefresh(chara_id)) { - *v23 = *v9; - v9 = v23; + RobItemEquip* rob_item_set = get_rob_management()->get_rob_robitem_work((ROB_ID)rc)->get_equip(); + if (selected_item >= 2 && data_test_equip_dw->GetRefresh(rc)) { + *rob_item_set = *item_set; + item_set = rob_item_set; } - data_test_equip_dw->SetCos(chara_id, v9); - data_test_equip_dw->sub_140261C40(chara_id); - data_test_equip_dw->sub_140261580(chara_id); + data_test_equip_dw->SetEquip(rc, item_set); + data_test_equip_dw->sub_140261C40(rc); + data_test_equip_dw->sub_140261580(rc); data_test_equip_dw->UpdateLayout(); - data_test_equip_dw->SetCharaItemCos(chara_id, v9); + data_test_equip_dw->SetCharaItemEquip(rc, item_set); } void DataTestEquipDw::RefreshCallback(dw::Widget* data) { dw::Button* button = dynamic_cast(data); if (button) { - int32_t chara_id = data_test_equip_dw->GetCharaID(); + int32_t rc = data_test_equip_dw->GetCharaID(); if (button->value) - data_test_equip_dw->SetRefresh(chara_id, false); + data_test_equip_dw->SetRefresh(rc, false); else - data_test_equip_dw->SetRefresh(chara_id, true); + data_test_equip_dw->SetRefresh(rc, true); } } void DataTestEquipDw::RobCallback(dw::Widget* data) { dw::ListBox* list_box = dynamic_cast(data); if (list_box) { - int32_t chara_id = (int32_t)list_box->list->selected_item; - data_test_equip_dw->SetCharaID(chara_id); - data_test_equip_dw->sub_140261C40(chara_id); - data_test_equip_dw->sub_140261AF0(chara_id); - data_test_equip_dw->sub_14025FD80(chara_id); + int32_t rc = (int32_t)list_box->list->selected_item; + data_test_equip_dw->SetCharaID(rc); + data_test_equip_dw->sub_140261C40(rc); + data_test_equip_dw->sub_140261AF0(rc); + data_test_equip_dw->sub_14025FD80(rc); } } -void DataTestEquipDw::sub_14025FD80(int32_t chara_id) { - if (this->chara_id != chara_id) +void DataTestEquipDw::sub_14025FD80(int32_t rc) { + if (this->rc != rc) return; - DataTestEquipDw::Data& data = this->data[chara_id]; + DataTestEquipDw::Data& data = this->data[rc]; for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { if (!IsEquipAllowed(i)) @@ -764,27 +752,27 @@ void DataTestEquipDw::sub_14025FD80(int32_t chara_id) { } } -void DataTestEquipDw::sub_140261520(int32_t chara_id) { - if (this->chara_id == chara_id) { - sub_140261C40(chara_id); - sub_140261AF0(chara_id); - sub_140261580(chara_id); +void DataTestEquipDw::sub_140261520(int32_t rc) { + if (this->rc == rc) { + sub_140261C40(rc); + sub_140261AF0(rc); + sub_140261580(rc); UpdateLayout(); } else - sub_140261580(chara_id); + sub_140261580(rc); } -void DataTestEquipDw::sub_140261580(int32_t chara_id) { - DataTestEquipDw::Data& data = this->data[chara_id]; +void DataTestEquipDw::sub_140261580(int32_t rc) { + DataTestEquipDw::Data& data = this->data[rc]; - CHARA_NUM chara_num = data.chara_num; + CHARA_NUM cn = data.cn; for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { if (!IsEquipAllowed(i)) continue; - std::vector* item_array = data_test_item_array_get(chara_num); + RobItemHaveSub* have_dbg = RobItem::get_have_sub_dbg(cn); data.items[j].clear(); data.field_278[j].clear(); data.current_items[j] = 0; @@ -793,7 +781,7 @@ void DataTestEquipDw::sub_140261580(int32_t chara_id) { data.field_278[j].insert({ 0, 0 }); int32_t index = 1; - for (int32_t& k : item_array[data_test_equip_sub_ids[i]]) { + for (uint32_t& k : have_dbg->part[data_test_equip_sub_ids[i]].item_no) { data.items[j].push_back(k); data.field_278[j].insert({ k, index++ }); } @@ -801,39 +789,35 @@ void DataTestEquipDw::sub_140261580(int32_t chara_id) { } } -void DataTestEquipDw::sub_140261AF0(int32_t chara_id) { +void DataTestEquipDw::sub_140261AF0(int32_t rc) { dw::ListBox* parts = item.parts; parts->ClearItems(); parts->AddItem("DEFAULT"); parts->AddItem("NUDE"); - for (auto& i : item_table_handler_array_get_table(data[chara_id].chara_num)->dbgset) + for (auto& i : *RobItem::get_dbgset(data[rc].cn)) parts->AddItem(i.first); } -void DataTestEquipDw::sub_140261C40(int32_t chara_id) { - DataTestEquipDw::Data& data = this->data[chara_id]; +void DataTestEquipDw::sub_140261C40(int32_t rc) { + DataTestEquipDw::Data& data = this->data[rc]; - CHARA_NUM chara_num = data.chara_num; + CHARA_NUM cn = data.cn; char buf[0x20]; - sprintf_s(buf, sizeof(buf), "ITEM EQUIP (%s)", get_chara_name_full(chara_num)); + sprintf_s(buf, sizeof(buf), "ITEM EQUIP (%s)", get_chara_name_full(cn)); SetText(buf); for (int32_t i = 0, j = 0; i < DATA_TEST_ITEM_EQUIP_MAX; i++) { if (!IsEquipAllowed(i)) continue; - std::vector* item_array = data_test_item_array_get(chara_num); + RobItemHaveSub* have_dbg = RobItem::get_have_sub_dbg(cn); item.list_box[j]->ClearItems(); item.list_box[j]->AddItem("REMOVE ITEM"); - for (int32_t& k : item_array[data_test_equip_sub_ids[i]]) { - char buf[0x200]; - sprintf_s(buf, sizeof(buf), "%03d %s", k, - item_table_handler_array_get_item_name(chara_num, k).c_str()); - item.list_box[j]->AddItem(buf); - } + for (uint32_t& k : have_dbg->part[data_test_equip_sub_ids[i]].item_no) + item.list_box[j]->AddItem(sprintf_s_string("%03d", k) + get_rob_item_table_name(cn, k)); j++; } } @@ -844,142 +828,64 @@ void data_test_equip_dw_init() { data_test_equip_dw->LimitPosDisp(); } else { - data_test_item_equip_array_load(); + RobItem::init_have_dbg(); //if (!data_test_item_check_dw_get_disp()) data_test_equip_dw->Disp(); } } -static int32_t data_test_equip_dw_get_disp_parts(int32_t chara_id) { +static int32_t data_test_equip_dw_get_disp_parts(int32_t rc) { if (data_test_equip_dw) - return data_test_equip_dw->GetDispParts(chara_id); + return data_test_equip_dw->GetDispParts(rc); return 0; } -static void data_test_equip_dw_set_chara_num(int32_t chara_id, CHARA_NUM chara_num) { +static void data_test_equip_dw_set_chara_num(int32_t rc, CHARA_NUM cn) { if (data_test_equip_dw) - data_test_equip_dw->SetCharaNum(chara_id, chara_num); - data_test_equip_dw_chara_index_array[chara_id] = chara_num; + data_test_equip_dw->SetCharaNum(rc, cn); + data_test_equip_dw_chara_index_array[rc] = cn; } -static void data_test_equip_dw_set_chara_item_cos(int32_t chara_id, const item_cos_data* cos) { +static void data_test_equip_dw_set_chara_item_equip(int32_t rc, const RobItemEquip* item_set) { if (data_test_equip_dw) - data_test_equip_dw->SetCharaItemCos(chara_id, cos); + data_test_equip_dw->SetCharaItemEquip(rc, item_set); } -static const item_cos_data* data_test_equip_dw_get_cos(int32_t chara_id) { +static const RobItemEquip* data_test_equip_dw_get_equip(int32_t rc) { if (data_test_equip_dw) - return data_test_equip_dw->GetCos(chara_id); + return data_test_equip_dw->GetEquip(rc); return 0; } -static int32_t data_test_equip_dw_get_item_no(int32_t chara_id) { +static int32_t data_test_equip_dw_get_item_no(int32_t rc) { if (data_test_equip_dw) - return data_test_equip_dw->GetItemNo(chara_id); + return data_test_equip_dw->GetItemNo(rc); return 0; } -static bool data_test_equip_dw_get_reset_item_no(int32_t chara_id) { +static bool data_test_equip_dw_get_reset_item_no(int32_t rc) { if (data_test_equip_dw) - return data_test_equip_dw->GetResetItemNo(chara_id); + return data_test_equip_dw->GetResetItemNo(rc); return false; } -static bool data_test_equip_dw_get_set_item_no(int32_t chara_id) { +static bool data_test_equip_dw_get_set_item_no(int32_t rc) { if (data_test_equip_dw) - return data_test_equip_dw->GetSetItemNo(chara_id); + return data_test_equip_dw->GetSetItemNo(rc); return false; } -static void data_test_equip_dw_reset_chara_item_cos(int32_t chara_id) { +static void data_test_equip_dw_reset_chara_item_cos(int32_t rc) { if (data_test_equip_dw) - data_test_equip_dw->ResetCharaItemCos(chara_id); + data_test_equip_dw->ResetCharaItemCos(rc); } -static void data_test_equip_dw_set_cos_id(int32_t chara_id, int32_t cos) { +static void data_test_equip_dw_set_cos_id(int32_t rc, int32_t cos) { if (data_test_equip_dw) - data_test_equip_dw->SetCosId(chara_id, cos); + data_test_equip_dw->SetCosId(rc, cos); } -static void data_test_equip_dw_sub_140261520(int32_t chara_id) { +static void data_test_equip_dw_sub_140261520(int32_t rc) { if (data_test_equip_dw) - data_test_equip_dw->sub_140261520(chara_id); -} - -static std::vector* data_test_item_array_get(CHARA_NUM chara_num) { - return data_test_item_array[chara_num]; -} - -static void data_test_item_array_load() { - if (data_test_item_array_load_count) - data_test_item_array_load_count++; - else - for (int32_t i = 0; i < CN_MAX; i++) { - const item_table* table = item_table_handler_array_get_table((CHARA_NUM)i); - if (!table) - continue; - - for (auto& j : table->item) { - const item_table_item* item = item_table_handler_array_get_item((CHARA_NUM)i, j.first); - if (item && item->sub_id != -1) - data_test_item_array[i][item->sub_id].push_back(j.first); - } - } -} - -static void data_test_item_array_unload() { - if (--data_test_item_array_load_count < 0) - data_test_item_array_load_count = 0; - else if (!data_test_item_array_load_count) - for (auto& i : data_test_item_array) - for (auto& j : i) { - j.clear(); - j.shrink_to_fit(); - } -} - -static std::vector* data_test_item_equip_array_get(CHARA_NUM chara_num) { - return data_test_item_equip_array[chara_num]; -} - -static void data_test_item_equip_array_load() { - if (data_test_item_equip_array_load_count) - data_test_item_equip_array_load_count++; - else - for (int32_t i = 0; i < CN_MAX; i++) { - const item_table* table = item_table_handler_array_get_table((CHARA_NUM)i); - if (!table || !data_test_item_equip_array[i]->size()) - continue; - - for (auto& j : table->item) { - int32_t equip = data_test_item_get_item_equip((CHARA_NUM)i, j.first); - if (equip != -1) - data_test_item_equip_array[i][equip].push_back(j.first); - } - } -} - -static void data_test_item_equip_array_unload() { - if (--data_test_item_equip_array_load_count < 0) - data_test_item_equip_array_load_count = 0; - else if (!data_test_item_equip_array_load_count) - for (auto& i : data_test_item_equip_array) - for (auto& j : i) { - j.clear(); - j.shrink_to_fit(); - } -} - -static int32_t data_test_item_get_item_equip(CHARA_NUM chara_num, int32_t item_no) { - static const int32_t data_test_item_item_equip_array[] = { - 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 2, 2, 4, 4, 4, 4, 4, 4, 2, 1, - }; - - if (!item_table_handler_array_get_table(chara_num)) - return -1; - - item_sub_id sub_id = item_table_handler_array_get_item_sub_id(chara_num, item_no); - if (sub_id != ITEM_SUB_NONE) - return data_test_item_item_equip_array[sub_id]; - return -1; + data_test_equip_dw->sub_140261520(rc); } diff --git a/src/ReDIVA/data_test/equip_test.hpp b/src/ReDIVA/data_test/equip_test.hpp index 28796079..b140189e 100644 --- a/src/ReDIVA/data_test/equip_test.hpp +++ b/src/ReDIVA/data_test/equip_test.hpp @@ -6,19 +6,19 @@ #pragma once #include "../../KKdLib/default.hpp" -#include "../../CRE/rob/rob.hpp" #include "../../CRE/task.hpp" class DtmEqVs : public app::Task { -public: - int32_t state; - int32_t chara_id; - CHARA_NUM chara_num; - CHARA_NUM curr_chara_num; - int32_t cos_id; - int32_t curr_cos_id; - int32_t disp_parts; +private: + int32_t m_mode; + int32_t m_rc; + int32_t m_cn_cur; + int32_t m_cn_pre; + int32_t m_cs_cur; + int32_t m_cs_pre; + int32_t m_dp; +public: DtmEqVs(); virtual ~DtmEqVs() override; @@ -26,10 +26,10 @@ public: virtual bool ctrl() override; virtual bool dest() override; - virtual bool add_task(int32_t chara_id, CHARA_NUM chara_index); + virtual bool add_task(int32_t rob_id, int32_t cn); virtual bool del_task(); - void SetCharaNumCosId(CHARA_NUM chara_index, int32_t cos_id); + void SetCharaNumCosId(int32_t cn, int32_t cs); void CtrlChara(); void CtrlDispParts(); diff --git a/src/ReDIVA/data_test/motion_test.cpp b/src/ReDIVA/data_test/motion_test.cpp index 41187cb6..e3dc4ef3 100644 --- a/src/ReDIVA/data_test/motion_test.cpp +++ b/src/ReDIVA/data_test/motion_test.cpp @@ -19,6 +19,7 @@ #include "../../CRE/stage_param.hpp" #include "../dw.hpp" #include "../input_state.hpp" +#include "../print_work.hpp" #include "auth_3d_test.hpp" #include "equip_test.hpp" #include "stage_test.hpp" @@ -26,7 +27,7 @@ class DataTestFaceMotDw : public dw::Shell { public: struct MotionData { - int32_t mottbl_index; + MOTTABLE_TYPE mottbl_type; float_t frame; }; @@ -37,8 +38,8 @@ public: MotionData mouth; }; - int32_t chara_id; - std::map motion_id_mottbl_map; + ROB_ID rob_id; + std::map motion_id_mottbl_map; dw::Button* enable; dw::ListBox* face; dw::Slider* face_frame; @@ -49,7 +50,7 @@ public: dw::ListBox* mouth; dw::Slider* mouth_frame; - DataTestFaceMotDw(int32_t chara_id); + DataTestFaceMotDw(ROB_ID id); virtual ~DataTestFaceMotDw() override; virtual void Hide() override; @@ -57,7 +58,7 @@ public: void AddMottblMapMotions(dw::ListBox* list_box, int32_t type); Data GetData(); bool GetEnable(); - void GetMottblIndexFrame(DataTestFaceMotDw::MotionData& data, uint32_t motion_id, float_t value); + void GetMottblIndexFrame(DataTestFaceMotDw::MotionData& data, uint32_t uid, float_t value); dw::ListBox* InitAddMottblMapMotions(dw::Composite* parent, int32_t type); void ResetMot(); }; @@ -222,7 +223,7 @@ public: dw::Button* ab_toggle_button; dw::Label* ab_loop; dw::Label* frame; - dw::Label* frame_count; + dw::Label* frame_max; DispButtonProc disp_button_proc; dw::Button* set_change_button; UseOpdButtonProc use_opd_button_proc; @@ -232,7 +233,7 @@ public: CreateEqDwProc create_eq_dw_proc; CreateDebugCamProc create_debug_cam_proc; - DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot); + DataTestMotDw(ROB_ID id, DtmMot* dtm_mot); virtual ~DataTestMotDw() override; virtual void Draw() override; @@ -240,10 +241,10 @@ public: virtual void ClearIDs(); virtual void AddID(const char* str); - virtual void SetFrameSlider(float_t frame, float_t frame_count); - virtual void SetFrameLabel(float_t frame, float_t frame_count); + virtual void SetFrameSlider(float_t frame, float_t frame_max); + virtual void SetFrameLabel(float_t frame, float_t frame_max); - void AddModules(int32_t chara_id, dw::ListBox* list_box); + void AddModules(ROB_ID id, dw::ListBox* list_box); void ResetFrame(); void ResetIDListBoxIndex(); void SetIDListBoxIndex(uint32_t index); @@ -365,8 +366,8 @@ static const char* data_test_mot_a3d_get_state_text(); static DataTestMotA3d* data_test_mot_a3d_get(); static void data_test_mot_a3d_set_auth_3d(std::string& value); -static void data_test_mot_dw_array_init(int32_t chara_id, DtmMot* dtm_mot); -static DataTestMotDw* data_test_mot_dw_array_get(int32_t chara_id); +static void data_test_mot_dw_array_init(ROB_ID id, DtmMot* dtm_mot); +static DataTestMotDw* data_test_mot_dw_array_get(ROB_ID id); static void data_test_mot_a3d_dw_init(); static DataTestMotA3dDw* data_test_mot_a3d_dw_get(); @@ -374,20 +375,20 @@ static DataTestMotA3dDw* data_test_mot_a3d_dw_get(); static void data_test_mot_ctrl_dw_init(); static DataTestMotCtrlDw* data_test_mot_ctrl_dw_get(); -static void data_test_face_mot_dw_array_init(int32_t chara_id); -static DataTestFaceMotDw* data_test_face_mot_dw_array_get(int32_t chara_id); +static void data_test_face_mot_dw_array_init(ROB_ID id); +static DataTestFaceMotDw* data_test_face_mot_dw_array_get(ROB_ID id); static void data_test_face_mot_dw_array_unload(); static bool motion_test_objset_check_not_read(); static void motion_test_objset_load(); static void motion_test_objset_unload(); -DataTestMot::Data::Offset::Offset() { +DataTestMot::Data::Off::Off() { array[0] = 0.0f; array[1] = 0.0f; } -DataTestMot::Data::Divide::Divide() { +DataTestMot::Data::Div::Div() { array[0] = 0.0f; array[1] = 0.0f; array[2] = 0.0f; @@ -400,13 +401,13 @@ DataTestMot::Data::Step::Step() { array[3] = 1.0f; } -DataTestMot::Data::Data() : chara_num(), curr_chara_num(), cos_id(), curr_cos_id(), -motion_set_index(), curr_motion_set_index(), motion_index(), curr_motion_index(), rot_y(), -trans_x(), offset(), start_frame(), type(), reset_mot(), reset_cam(), reload_data(), -sync_frame(), field_A8(), field_A9(), running(), field_AC(), field_B0(), sync_1p_frame() { - for (uint32_t& i : motion_set_index) +DataTestMot::Data::Data() : chr(), curr_chr(), ptr(), curr_ptr(), set(), +curr_set(), uid(), curr_uid(), rot_y(), trans_x(), off(), start_frame(), +type(), reset_mot(), reset_cam(), reload_data(), sync_frame(), field_A8(), +field_A9(), running(), field_AC(), field_B0(), sync_1p_frame() { + for (uint32_t& i : set) i = -1; - for (uint32_t& i : curr_motion_set_index) + for (uint32_t& i : curr_set) i = -1; field_AA = true; } @@ -428,14 +429,14 @@ bool DataTestMot::init() { cam->set_interest({ 0.0f, 1.0f, 0.0f }); cam->set_roll(0.0f); - data_test_mot_dw_array_init(0, &dtm_mot_array[0]); - data_test_mot_dw_array_init(1, &dtm_mot_array[1]); + data_test_mot_dw_array_init(ROB_ID_1P, &dtm_mot_array[ROB_ID_1P]); + data_test_mot_dw_array_init(ROB_ID_2P, &dtm_mot_array[ROB_ID_2P]); data_test_mot_ctrl_dw_init(); data_test_mot_a3d_dw_init(); data.reset_cam = true; data.field_A8 = true; - dtm_eq_vs_array[0].add_task(0, data.chara_num[0]); - dtm_eq_vs_array[1].add_task(1, data.chara_num[1]); + dtm_eq_vs_array[ROB_ID_1P].add_task(ROB_ID_1P, data.chr[ROB_ID_1P]); + dtm_eq_vs_array[ROB_ID_2P].add_task(ROB_ID_2P, data.chr[ROB_ID_2P]); motion_test_objset_load(); return true; } @@ -444,7 +445,7 @@ bool DataTestMot::ctrl() { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - data_test_mot_dw_array_get(0)->sub_14028D8B0(); + data_test_mot_dw_array_get(ROB_ID_1P)->sub_14028D8B0(); bool v3 = false; bool v2 = false; @@ -455,156 +456,158 @@ bool DataTestMot::ctrl() { v2 = true; } - if (data.chara_num[0] != data.curr_chara_num[0]) { - data.curr_chara_num[0] = data.chara_num[0]; - dtm_eq_vs_array[0].SetCharaNumCosId(data.chara_num[0], data.cos_id[0]); + if (data.chr[ROB_ID_1P] != data.curr_chr[ROB_ID_1P]) { + data.curr_chr[ROB_ID_1P] = data.chr[ROB_ID_1P]; + dtm_eq_vs_array[ROB_ID_1P].SetCharaNumCosId(data.chr[ROB_ID_1P], data.ptr[ROB_ID_1P]); v3 = true; v2 = true; } - if (data.chara_num[1] != data.curr_chara_num[1]) { - data.curr_chara_num[1] = data.chara_num[1]; - dtm_eq_vs_array[1].SetCharaNumCosId(data.chara_num[1], data.cos_id[1]); + if (data.chr[ROB_ID_2P] != data.curr_chr[ROB_ID_2P]) { + data.curr_chr[ROB_ID_2P] = data.chr[ROB_ID_2P]; + dtm_eq_vs_array[ROB_ID_2P].SetCharaNumCosId(data.chr[ROB_ID_2P], data.ptr[ROB_ID_2P]); v3 = true; v2 = true; } - if (data.cos_id[0] != data.curr_cos_id[0]) { - data.curr_cos_id[0] = data.cos_id[0]; - dtm_eq_vs_array[0].SetCharaNumCosId(data.chara_num[0], data.cos_id[0]); + if (data.ptr[ROB_ID_1P] != data.curr_ptr[ROB_ID_1P]) { + data.curr_ptr[ROB_ID_1P] = data.ptr[ROB_ID_1P]; + dtm_eq_vs_array[ROB_ID_1P].SetCharaNumCosId(data.chr[ROB_ID_1P], data.ptr[ROB_ID_1P]); v3 = true; v2 = true; } - if (data.cos_id[1] != data.curr_cos_id[1]) { - data.curr_cos_id[1] = data.cos_id[1]; - dtm_eq_vs_array[1].SetCharaNumCosId(data.chara_num[1], data.cos_id[1]); + if (data.ptr[ROB_ID_2P] != data.curr_ptr[ROB_ID_2P]) { + data.curr_ptr[ROB_ID_2P] = data.ptr[ROB_ID_2P]; + dtm_eq_vs_array[ROB_ID_2P].SetCharaNumCosId(data.chr[ROB_ID_2P], data.ptr[ROB_ID_2P]); v3 = true; v2 = true; } - if (data.motion_set_index[0] != data.curr_motion_set_index[0]) { - data.curr_motion_set_index[0] = data.motion_set_index[0]; + if (data.set[ROB_ID_1P] != data.curr_set[ROB_ID_1P]) { + data.curr_set[ROB_ID_1P] = data.set[ROB_ID_1P]; - data_test_mot_dw_array_get(0)->ClearIDs(); + data_test_mot_dw_array_get(ROB_ID_1P)->ClearIDs(); - const motion_set_info& set_info = aft_mot_db->motion_set[data.motion_set_index[0]]; + const motion_set_info& set_info = aft_mot_db->motion_set[data.set[ROB_ID_1P]]; for (const motion_info& i : set_info.motion) - data_test_mot_dw_array_get(0)->AddID(i.name.c_str()); + data_test_mot_dw_array_get(ROB_ID_1P)->AddID(i.name.c_str()); - data_test_mot_dw_array_get(0)->ResetIDListBoxIndex(); + data_test_mot_dw_array_get(ROB_ID_1P)->ResetIDListBoxIndex(); + + data.curr_uid[ROB_ID_1P] = 0; + data.uid[ROB_ID_1P] = 0; - data.curr_motion_index[0] = 0; - data.motion_index[0] = 0; v3 = true; v2 = true; } - if (data.motion_set_index[1] != data.curr_motion_set_index[1]) { - data.curr_motion_set_index[1] = data.motion_set_index[1]; + if (data.set[ROB_ID_2P] != data.curr_set[ROB_ID_2P]) { + data.curr_set[ROB_ID_2P] = data.set[ROB_ID_2P]; - data_test_mot_dw_array_get(1)->ClearIDs(); + data_test_mot_dw_array_get(ROB_ID_2P)->ClearIDs(); - const motion_set_info& set_info = aft_mot_db->motion_set[data.motion_set_index[1]]; + const motion_set_info& set_info = aft_mot_db->motion_set[data.set[ROB_ID_2P]]; for (const motion_info& i : set_info.motion) - data_test_mot_dw_array_get(1)->AddID(i.name.c_str()); + data_test_mot_dw_array_get(ROB_ID_2P)->AddID(i.name.c_str()); - data_test_mot_dw_array_get(1)->ResetIDListBoxIndex(); + data_test_mot_dw_array_get(ROB_ID_2P)->ResetIDListBoxIndex(); - data.curr_motion_index[1] = 0; - data.motion_index[1] = 0; + data.curr_uid[ROB_ID_2P] = 0; + data.uid[ROB_ID_2P] = 0; v3 = true; v2 = true; } bool frame_comp = false; - if (data.motion_index[0] != data.curr_motion_index[0]) { - data.curr_motion_index[0] = data.motion_index[0]; - dtm_mot_array[0].SetMotion(data.motion_set_index[0], data.motion_index[0]); - dtm_mot_array[1].SetMotion(data.motion_set_index[1], data.motion_index[1]); - dtm_mot_array[0].SetChangeMotion(); - dtm_mot_array[1].SetChangeMotion(); + if (data.uid[ROB_ID_1P] != data.curr_uid[ROB_ID_1P]) { + data.curr_uid[ROB_ID_1P] = data.uid[ROB_ID_1P]; + dtm_mot_array[ROB_ID_1P].SetMotion(data.set[ROB_ID_1P], data.uid[ROB_ID_1P]); + dtm_mot_array[ROB_ID_2P].SetMotion(data.set[ROB_ID_2P], data.uid[ROB_ID_2P]); + dtm_mot_array[ROB_ID_1P].SetChangeMotion(); + dtm_mot_array[ROB_ID_2P].SetChangeMotion(); frame_comp = true; } - if (data.motion_index[1] != data.curr_motion_index[1]) { - data.curr_motion_index[1] = data.motion_index[1]; - dtm_mot_array[0].SetMotion(data.motion_set_index[0], data.motion_index[0]); - dtm_mot_array[1].SetMotion(data.motion_set_index[1], data.motion_index[1]); - dtm_mot_array[0].SetChangeMotion(); - dtm_mot_array[1].SetChangeMotion(); + if (data.uid[ROB_ID_2P] != data.curr_uid[ROB_ID_2P]) { + data.curr_uid[ROB_ID_2P] = data.uid[ROB_ID_2P]; + dtm_mot_array[ROB_ID_1P].SetMotion(data.set[ROB_ID_1P], data.uid[ROB_ID_1P]); + dtm_mot_array[ROB_ID_2P].SetMotion(data.set[ROB_ID_2P], data.uid[ROB_ID_2P]); + dtm_mot_array[ROB_ID_1P].SetChangeMotion(); + dtm_mot_array[ROB_ID_2P].SetChangeMotion(); } - dtm_mot_array[0].SetRotationY(data.rot_y[0]); - dtm_mot_array[1].SetRotationY(data.rot_y[1]); - dtm_mot_array[0].SetTrans({ data.trans_x[0], 0.0f, 0.0f }); - dtm_mot_array[1].SetTrans({ data.trans_x[1], 0.0f, 0.0f }); - dtm_mot_array[0].SetOffset(data.offset[0].array[0], data.offset[0].array[1]); - dtm_mot_array[1].SetOffset(data.offset[1].array[0], data.offset[1].array[1]); - dtm_mot_array[0].SetStartFrame(data.start_frame[0]); - dtm_mot_array[1].SetStartFrame(data.start_frame[1]); + dtm_mot_array[ROB_ID_1P].SetRotationY(data.rot_y[ROB_ID_1P]); + dtm_mot_array[ROB_ID_2P].SetRotationY(data.rot_y[ROB_ID_2P]); + dtm_mot_array[ROB_ID_1P].SetTrans({ data.trans_x[ROB_ID_1P], 0.0f, 0.0f }); + dtm_mot_array[ROB_ID_2P].SetTrans({ data.trans_x[ROB_ID_2P], 0.0f, 0.0f }); + dtm_mot_array[ROB_ID_1P].SetOffset(data.off[ROB_ID_1P].array[0], data.off[ROB_ID_1P].array[1]); + dtm_mot_array[ROB_ID_2P].SetOffset(data.off[ROB_ID_2P].array[0], data.off[ROB_ID_2P].array[1]); + dtm_mot_array[ROB_ID_1P].SetStartFrame(data.start_frame[ROB_ID_1P]); + dtm_mot_array[ROB_ID_2P].SetStartFrame(data.start_frame[ROB_ID_2P]); for (int32_t i = 0; i < 3; i++) { - dtm_mot_array[0].SetDivide(i, data.divide[0].array[i]); - dtm_mot_array[1].SetDivide(i, data.divide[1].array[i]); + dtm_mot_array[ROB_ID_1P].SetDivide(i, data.div[ROB_ID_1P].array[i]); + dtm_mot_array[ROB_ID_2P].SetDivide(i, data.div[ROB_ID_2P].array[i]); } for (int32_t i = 0; i < 4; i++) { - dtm_mot_array[0].SetStep(i, data.step[0].array[i]); - dtm_mot_array[1].SetStep(i, data.step[1].array[i]); + dtm_mot_array[ROB_ID_1P].SetStep(i, data.step[ROB_ID_1P].array[i]); + dtm_mot_array[ROB_ID_2P].SetStep(i, data.step[ROB_ID_2P].array[i]); } switch (data.type) { case 0: { - dtm_mot_array[0].SetLoop(false); - dtm_mot_array[1].SetLoop(false); + dtm_mot_array[ROB_ID_1P].SetLoop(false); + dtm_mot_array[ROB_ID_2P].SetLoop(false); - dtm_mot_array[0].SetPlay(true); - dtm_mot_array[1].SetPlay(true); + dtm_mot_array[ROB_ID_1P].SetPlay(true); + dtm_mot_array[ROB_ID_2P].SetPlay(true); } break; case 1: { - dtm_mot_array[0].SetLoop(true); - dtm_mot_array[1].SetLoop(true); + dtm_mot_array[ROB_ID_1P].SetLoop(true); + dtm_mot_array[ROB_ID_2P].SetLoop(true); - dtm_mot_array[0].SetPlay(true); - dtm_mot_array[1].SetPlay(true); + dtm_mot_array[ROB_ID_1P].SetPlay(true); + dtm_mot_array[ROB_ID_2P].SetPlay(true); } break; case 2: { - dtm_mot_array[0].SetLoop(true); - dtm_mot_array[1].SetLoop(true); + dtm_mot_array[ROB_ID_1P].SetLoop(true); + dtm_mot_array[ROB_ID_2P].SetLoop(true); - bool play = input_state_get(0)->CheckIntervalTapped(INPUT_BUTTON_SPACE); - dtm_mot_array[0].SetPlay(play); - dtm_mot_array[1].SetPlay(play); + bool move = input_state_get(0)->CheckIntervalTapped(INPUT_BUTTON_SPACE); + dtm_mot_array[ROB_ID_1P].SetPlay(move); + dtm_mot_array[ROB_ID_2P].SetPlay(move); } break; } if (data.reset_mot) { data.reset_mot = false; - dtm_mot_array[0].SetResetMot(); - dtm_mot_array[1].SetResetMot(); + dtm_mot_array[ROB_ID_1P].SetResetMot(); + dtm_mot_array[ROB_ID_2P].SetResetMot(); } if (data.sync_frame) { - int32_t chara_id = dtm_mot_array[1].GetFrameCount() > dtm_mot_array[0].GetFrameCount() ? 1 : 0; - float_t frame = dtm_mot_array[chara_id].GetFrame(); - dtm_mot_array[0].SetFrame(frame); - dtm_mot_array[1].SetFrame(frame); + ROB_ID rob_id = (ROB_ID)dtm_mot_array[ROB_ID_2P].GetFrameCount() > dtm_mot_array[ROB_ID_1P].GetFrameCount() + ? ROB_ID_2P : ROB_ID_1P; + float_t frame = dtm_mot_array[rob_id].GetFrame(); + dtm_mot_array[ROB_ID_1P].SetFrame(frame); + dtm_mot_array[ROB_ID_2P].SetFrame(frame); } if (v3) - dtm_mot_array[0].del_task(); + dtm_mot_array[ROB_ID_1P].del_task(); else - dtm_mot_array[0].add_task(data.chara_num[0], - data.cos_id[0], data.motion_set_index[0], data.motion_index[0]); + dtm_mot_array[ROB_ID_1P].add_task(data.chr[ROB_ID_1P], + data.ptr[ROB_ID_1P], data.set[ROB_ID_1P], data.uid[ROB_ID_1P]); if (v2) - dtm_mot_array[1].del_task(); + dtm_mot_array[ROB_ID_2P].del_task(); else - dtm_mot_array[1].add_task(data.chara_num[1], - data.cos_id[1], data.motion_set_index[1], data.motion_index[1]); + dtm_mot_array[ROB_ID_2P].add_task(data.chr[ROB_ID_2P], + data.ptr[ROB_ID_2P], data.set[ROB_ID_2P], data.uid[ROB_ID_2P]); if (data.reset_cam) { data.reset_cam = false; @@ -629,16 +632,16 @@ bool DataTestMot::ctrl() { //sub_1401F9510(data.field_A9 ? 32.2673416137695f : 32.8125f); } - if (data.running && dtm_mot_array[0].CheckFirstFrame() && !frame_comp - && data.motion_index[0] < aft_mot_db->motion_set[data.motion_set_index[0]].motion.size()) { - data.curr_motion_index[0] = data.motion_index[0]; - data.motion_index[0] = data.motion_index[0] + 1; - dtm_mot_array[0].SetMotion(data.motion_set_index[0], data.motion_index[0]); - dtm_mot_array[1].SetMotion(data.motion_set_index[1], data.motion_index[1]); - dtm_mot_array[0].SetChangeMotion(); - dtm_mot_array[1].SetChangeMotion(); + if (data.running && dtm_mot_array[ROB_ID_1P].CheckFirstFrame() && !frame_comp + && data.uid[ROB_ID_1P] < aft_mot_db->motion_set[data.set[ROB_ID_1P]].motion.size()) { + data.curr_uid[ROB_ID_1P] = data.uid[ROB_ID_1P]; + data.uid[ROB_ID_1P] = data.uid[ROB_ID_1P] + 1; + dtm_mot_array[ROB_ID_1P].SetMotion(data.set[ROB_ID_1P], data.uid[ROB_ID_1P]); + dtm_mot_array[ROB_ID_2P].SetMotion(data.set[ROB_ID_2P], data.uid[ROB_ID_2P]); + dtm_mot_array[ROB_ID_1P].SetChangeMotion(); + dtm_mot_array[ROB_ID_2P].SetChangeMotion(); - data_test_mot_dw_array_get(0)->SetIDListBoxIndex(data.motion_index[0]); + data_test_mot_dw_array_get(ROB_ID_1P)->SetIDListBoxIndex(data.uid[ROB_ID_1P]); } motion_test_objset_check_not_read(); @@ -650,15 +653,15 @@ bool DataTestMot::dest() { clear_color = 0xFF000000; set_clear_color = true; - dtm_mot_array[0].del(); - dtm_mot_array[1].del(); - data_test_mot_dw_array_get(0)->Hide(); - data_test_mot_dw_array_get(1)->Hide(); + dtm_mot_array[ROB_ID_1P].del(); + dtm_mot_array[ROB_ID_2P].del(); + data_test_mot_dw_array_get(ROB_ID_1P)->Hide(); + data_test_mot_dw_array_get(ROB_ID_2P)->Hide(); data_test_mot_ctrl_dw_get()->Hide(); data_test_mot_a3d_dw_get()->Hide(); data_test_face_mot_dw_array_unload(); - dtm_eq_vs_array[0].del_task(); - dtm_eq_vs_array[1].del_task(); + dtm_eq_vs_array[ROB_ID_1P].del_task(); + dtm_eq_vs_array[ROB_ID_2P].del_task(); motion_test_objset_unload(); data_test_mot_a3d_get()->del(); return true; @@ -669,11 +672,12 @@ void DataTestMot::disp() { } void DataTestMot::sub_140286280() { - dtm_mot_array[0].sub_1402922C0(true); - dtm_mot_array[0].sub_1402922C0(true); - if (data.sync_frame && (!dtm_mot_array[0].GetLoaded() || !dtm_mot_array[1].GetLoaded())) { - dtm_mot_array[0].sub_1402922C0(false); - dtm_mot_array[0].sub_1402922C0(false); + dtm_mot_array[ROB_ID_1P].sub_1402922C0(true); + dtm_mot_array[ROB_ID_1P].sub_1402922C0(true); + if (data.sync_frame && (!dtm_mot_array[ROB_ID_1P].GetLoaded() + || !dtm_mot_array[ROB_ID_2P].GetLoaded())) { + dtm_mot_array[ROB_ID_1P].sub_1402922C0(false); + dtm_mot_array[ROB_ID_1P].sub_1402922C0(false); } } @@ -879,29 +883,29 @@ void DataTestMotA3d::Sync1pFrame() { if (!data_test_mot_data_get()->sync_1p_frame) return; - float_t frame = dtm_mot_array[0].GetFrame(); + float_t frame = dtm_mot_array[ROB_ID_1P].GetFrame(); if (get_pause()) - frame -= dtm_mot_array[0].GetStep(); + frame -= dtm_mot_array[ROB_ID_1P].GetStep(); for (auth_3d_id& i : auth_3d_ids) i.set_req_frame(frame); } -DtmMot::DtmMot() : rob_bone_data(), type(), rot_y(), pre_offset(), post_offset(), divide(), -loop(), change_motion(), use_opd(), loaded(), reset_mot(), save_only_start_frame(), state(), +DtmMot::DtmMot() : rob_man(), motion(), assign(), rot(), pre_offset(), post_offset(), div(), +loop(), reset_osage_flag(), use_opd(), loaded(), reset_mot(), save_only_start_frame(), state(), frame(), delta_frame(), looped(), start_frame(), ab_frame(), ab_loop(), set_motion_index() { - chara_id = -1; - chara_num = CN_MAX; - cos_id = 502; - motion_set_id = -1; - motion_id = -1; + rctrl = ROB_ID_NULL; + chr = CN_MAX; + ptr = 502; + set = -1; + uid = -1; step[0] = 0.0f; step[1] = 0.0f; step[2] = 0.0f; step[3] = 1.0f; - play = true; - field_D2 = true; - disp = true; + move = true; + item = true; + display = true; partial_mot = true; pv_id = -1; field_100 = true; @@ -917,7 +921,7 @@ bool DtmMot::init() { state = 1; looped = false; - if (chara_num < 0 || chara_num >= CN_MAX || cos_id >= 502) { + if (chr < 0 || chr >= CN_MAX || ptr >= 502) { state = 0; return true; } @@ -925,23 +929,23 @@ bool DtmMot::init() { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - if (!type) { - int32_t motion_set_index = this->motion_set_index; - int32_t motion_index = this->motion_index; - if (aft_mot_db->motion_set.size() <= motion_set_index) { + if (assign == IDX) { + uint32_t set = this->set; + uint32_t uid = this->uid; + if (aft_mot_db->motion_set.size() <= set) { state = 0; return true; } - motion_set_id = aft_mot_db->motion_set[motion_set_index].id; - if (aft_mot_db->motion_set[motion_set_index].motion.size() <= motion_index) { + this->set = aft_mot_db->motion_set[set].id; + if (aft_mot_db->motion_set[set].motion.size() <= uid) { state = 0; return true; } - motion_id = aft_mot_db->motion_set[motion_set_index].motion[motion_index].id; + this->uid = aft_mot_db->motion_set[set].motion[uid].id; } - pv_id = DtmMot::ConvertMotionSetNameToPVID(aft_mot_db->get_motion_set_name(motion_set_id)); + pv_id = DtmMot::ConvertMotionSetNameToPVID(aft_mot_db->get_motion_set_name(set)); loaded = false; return true; } @@ -962,67 +966,67 @@ bool DtmMot::ctrl() { } } - motion_set_load_motion(motion_set_id, "", aft_mot_db); - motion_set_load_mothead(motion_set_id, "", aft_mot_db); + motion_set_load_motion(set, "", aft_mot_db); + motion_set_load_mothead(set, "", aft_mot_db); state = 2; } break; case 2: { - if (motion_storage_check_mot_file_not_ready(motion_set_id) - || mothead_storage_check_mhd_file_not_ready(motion_set_id) + if (motion_storage_check_mot_file_not_ready(set) + || mothead_storage_check_mhd_file_not_ready(set) || dsc_file_handler.check_not_ready()) break; - const motion_set_info* set_info = aft_mot_db->get_motion_set_by_id(motion_set_id); + const motion_set_info* set_info = aft_mot_db->get_motion_set_by_id(set); const size_t motion_count = set_info->motion.size(); for (size_t i = 0; i < motion_count; i++) - motion_storage_get_mot_data_frame_count(set_info->motion.data()[i].id, aft_mot_db); + get_mot_frame_max(set_info->motion.data()[i].id, aft_mot_db); state = 3; } break; case 3: { - if (chara_id >= 0 && chara_id < ROB_ID_MAX && task_rob_manager_get_wait(chara_id)) + if (rctrl >= 0 && rctrl < ROB_ID_MAX && task_rob_manager_get_wait(rctrl)) break; - rob_chara_pv_data pv_data; - pv_data.type = ROB_CHARA_TYPE_3; + RobInit rob_init; + rob_init.rob_type = ROB_TYPE_DATA_TEST; module_data data; - if (module_data_handler_data_get_module(chara_num, cos_id, data)) { - pv_data.sleeve_l = data.sleeve_l; - pv_data.sleeve_r = data.sleeve_r; + if (module_data_handler_data_get_module(chr, ptr, data)) { + rob_init.sleeve_l = data.sleeve_l; + rob_init.sleeve_r = data.sleeve_r; } - chara_id = rob_chara_array_init_chara_num(chara_num, pv_data, cos_id, true); + rctrl = rob_man->create_rob(chr, rob_init, ptr, true); state = 4; } break; case 4: { - if (!task_rob_manager_check_chara_loaded(chara_id)) + if (!task_rob_manager_check_chara_loaded(rctrl)) break; - rob_bone_data = rob_chara_array_get_bone_data(chara_id); + motion = rob_man->get_rob_motion_work(rctrl); state = 7; } break; case 5: { if (osage_play_data_manager_check_task_ready()) break; - osage_play_data_manager_append_chara_motion_id(rob_chara_array_get(chara_id), motion_id); + osage_play_data_manager_append_chara_motion_id(rob_man->get_rob(rctrl), uid); osage_play_data_manager_add_task(); state = 6; } break; case 6: { - if (osage_play_data_manager_check_task_ready() || skin_param_manager_check_task_ready(chara_id)) + if (osage_play_data_manager_check_task_ready() || skin_param_manager_check_task_ready(rctrl)) break; - rob_chara* rob_chr = rob_chara_array_get(chara_id); - rob_chr->set_motion_id(motion_id, frame, 0.0f, true, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chara* rob_chr = rob_man->get_rob(rctrl); + rob_chr->replace_rob_motion(uid, frame, 0.0f, true, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); rob_chr->set_use_opd(true); state = 11; } break; case 7: { loaded = false; - if (skin_param_manager_check_task_ready(chara_id) - || pv_osage_manager_array_get_disp(chara_id) + if (skin_param_manager_check_task_ready(rctrl) + || pv_osage_manager_array_get_disp(rctrl) || osage_play_data_manager_check_task_ready()) break; @@ -1032,39 +1036,39 @@ bool DtmMot::ctrl() { pv_data.reset(); pv_data.dsc.parse(dsc_file_handler.get_data(), dsc_file_handler.get_size(), DSC_FT); - int32_t chara_id = 0; + int32_t rctrl = 0; for (auto& i : diff->motion) for (const pv_db_pv_motion& j : i) - if (j.id == motion_id) { - chara_id = (int32_t)(&i - diff->motion); + if (j.id == uid) { + rctrl = (int32_t)(&i - diff->motion); break; } - pv_data.find_playdata_set_motion(chara_id); + pv_data.find_playdata_set_motion(rctrl); pv_data.find_set_motion(diff); - const std::vector* set_motion = pv_data.get_set_motion(chara_id); + const std::vector* set_motion = pv_data.get_set_motion(rctrl); if (set_motion) { this->set_motion.assign(set_motion->begin(), set_motion->end()); - const mothead_data* data = mothead_storage_get_mot_by_motion_id(motion_id, aft_mot_db)->data; - if (data && data->type >= MOTHEAD_DATA_TYPE_0) { - mothead_data_type type = data->type; - while (type != MOTHEAD_DATA_OSAGE_RESET) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + const MhpList* pp_list = mothead_storage_get_mot_by_motion_id(uid, aft_mot_db)->pp_list; + if (pp_list && pp_list->type >= 0) { + int32_t type = pp_list->type; + while (type != MHP_OSAGE_RESET) { + pp_list++; + type = pp_list->type; + if (type < 0) break; } while (true) { - if (type < MOTHEAD_DATA_TYPE_0) + if (type < 0) break; auto j_begin = this->set_motion.begin(); auto j_end = this->set_motion.end(); for (auto j = j_begin; j != j_end; ) - if ((float_t)data->frame == j->frame_stage_index.first) { + if ((float_t)pp_list->frame == j->frame_stage_index.first) { std::move(j + 1, j_end, j); this->set_motion.pop_back(); j_end = this->set_motion.end(); @@ -1072,15 +1076,15 @@ bool DtmMot::ctrl() { else j++; - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + pp_list++; + type = pp_list->type; + if (type < 0) break; - while (type != MOTHEAD_DATA_OSAGE_RESET) { - data++; - type = data->type; - if (type < MOTHEAD_DATA_TYPE_0) + while (type != MHP_OSAGE_RESET) { + pp_list++; + type = pp_list->type; + if (type < 0) break; } } @@ -1094,33 +1098,33 @@ bool DtmMot::ctrl() { state = 8; } break; case 8: { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_man->get_rob(rctrl); rob_chr->set_use_opd(false); - skin_param_manager_reset(chara_id); + skin_param_manager_reset(rctrl); std::vector vec; vec.push_back({ rob_chr }); - vec.push_back({ rob_chr, pv_id, motion_id }); + vec.push_back({ rob_chr, pv_id, uid }); const pv_db_pv* pv = task_pv_db_get_pv(pv_id); if (pv) { for (const pv_db_pv_osage_init& i : pv->osage_init) { uint32_t mot_id = aft_mot_db->get_motion_id(i.motion.c_str()); - if (mot_id != -1 && mot_id == motion_id) + if (mot_id != -1 && mot_id == uid) vec.push_back({ rob_chr, pv_id, mot_id, "", i.frame }); } for (pv_data_set_motion& i : set_motion) - vec.push_back({ rob_chr, pv->id, i.motion_id, "", (int32_t)prj::roundf(i.frame_stage_index.first) }); + vec.push_back({ rob_chr, pv->id, i.motnum, "", (int32_t)prj::roundf(i.frame_stage_index.first) }); } - skin_param_manager_add_task(chara_id, vec); + skin_param_manager_add_task(rctrl, vec); state = 9; const uint32_t* opd_motion_set_ids = get_opd_motion_set_ids(); while (*opd_motion_set_ids != -1) { - if (*opd_motion_set_ids != motion_set_id) { + if (*opd_motion_set_ids != set) { opd_motion_set_ids++; continue; } @@ -1131,27 +1135,27 @@ bool DtmMot::ctrl() { } } break; case 9: { - if (skin_param_manager_check_task_ready(chara_id)) + if (skin_param_manager_check_task_ready(rctrl)) break; - pv_osage_manager_array_reset(chara_id); + pv_osage_manager_array_reset(rctrl); if (save_only_start_frame) { pv_data_set_motion motion; - motion.motion_id = motion_id; + motion.motnum = uid; motion.frame_stage_index.first = start_frame; motion.frame_stage_index.second = task_stage_get_current_stage_index(); std::vector set_motion; set_motion.push_back(motion); - pv_osage_manager_array_set_pv_set_motion(chara_id, set_motion); + pv_osage_manager_array_set_pv_set_motion(rctrl, set_motion); } else { std::vector motion_ids; - motion_ids.push_back(motion_id); - pv_osage_manager_array_set_motion_ids(chara_id, motion_ids); + motion_ids.push_back(uid); + pv_osage_manager_array_set_motion_ids(rctrl, motion_ids); if (pv_id >= 0) - pv_osage_manager_array_set_pv_set_motion(chara_id, set_motion); + pv_osage_manager_array_set_pv_set_motion(rctrl, set_motion); } if (pv_id >= 0) { @@ -1159,7 +1163,7 @@ bool DtmMot::ctrl() { stage_param_data_coli_data_load(pv_id); } - pv_osage_manager_array_set_pv_id(chara_id, pv_id, 0); + pv_osage_manager_array_set_pv_id(rctrl, pv_id, 0); state = 10; } break; case 10: { @@ -1168,7 +1172,7 @@ bool DtmMot::ctrl() { int32_t stage_index = task_stage_get_current_stage_index(); if (stage_index != -1) - rob_chara_array_get(chara_id)->set_stage_data_ring(stage_index); + rob_man->get_rob(rctrl)->set_stage_data_ring(stage_index); state = 11; } break; case 11: { @@ -1183,14 +1187,14 @@ bool DtmMot::ctrl() { case 12: { frame = start_frame; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_man->get_rob(rctrl); rob_chr->set_step_motion_step(1.0f); - rob_chr->set_motion_id(motion_id, frame, 0.0f, true, true, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); + rob_chr->replace_rob_motion(uid, frame, 0.0f, true, true, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); set_motion_index = 0; - if (data_test_face_mot_dw_array_get(chara_id)) - data_test_face_mot_dw_array_get(chara_id)->Reset(); + if (data_test_face_mot_dw_array_get(rctrl)) + data_test_face_mot_dw_array_get(rctrl)->Reset(); state = 13; } case 13: { @@ -1201,13 +1205,13 @@ bool DtmMot::ctrl() { else if (get_pause()) break; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_man->get_rob(rctrl); float_t frame = this->frame; if (frame >= pre_offset) - frame = min_def(rob_chr->data.motdata.field_0.frame, frame - pre_offset); + frame = min_def(rob_chr->rob_base.motdata.frame, frame - pre_offset); - rob_bone_data->motion_step(); + motion->motion_step(); rob_chr->set_frame(frame); rob_chr->set_step_motion_step(delta_frame); @@ -1221,45 +1225,45 @@ bool DtmMot::ctrl() { rob_chr->arm_adjust_ctrl(); if (!partial_mot) { - rob_bone_data->load_face_motion(-1, aft_mot_db); - rob_bone_data->load_hand_l_motion(-1, aft_mot_db); - rob_bone_data->load_hand_r_motion(-1, aft_mot_db); - rob_bone_data->load_mouth_motion(-1, aft_mot_db); - rob_bone_data->load_eyes_motion(-1, aft_mot_db); - rob_bone_data->load_eyelid_motion(-1, aft_mot_db); + motion->load_face_motion(-1, aft_mot_db); + motion->load_hand_l_motion(-1, aft_mot_db); + motion->load_hand_r_motion(-1, aft_mot_db); + motion->load_mouth_motion(-1, aft_mot_db); + motion->load_eyes_motion(-1, aft_mot_db); + motion->load_eyelid_motion(-1, aft_mot_db); } CtrlFaceMot(); - rob_bone_data->interpolate(); + motion->interpolate(); mat4 mat; - mat4_rotate_zyx(&rotation, &mat); - mat4_mul_rotate_y(&mat, rot_y, &mat); - mat4_set_translation(&mat, &trans); - rob_bone_data->update(&mat); + mat4_rotate_zyx(rot[0], rot[1], rot[2], &mat); + mat4_mul_rotate_y(&mat, rot[3], &mat); + mat4_set_translation(&mat, &pos); + motion->update(&mat); rob_chr->adjust_ctrl(); - rob_chr->set_data_adjust_mat(&rob_chr->data.adjust_data); + rob_chr->set_data_adjust_mat(&rob_chr->rob_base.adjust); rob_chr->rob_motion_modifier_ctrl(); rob_chr->sub_140509D30(); - if (data_test_mot_dw_array_get(chara_id)) { - data_test_mot_dw_array_get(chara_id)->SetFrameSlider(GetFrame(), + if (data_test_mot_dw_array_get(rctrl)) { + data_test_mot_dw_array_get(rctrl)->SetFrameSlider(GetFrame(), GetFrameCount() + pre_offset + post_offset); - data_test_mot_dw_array_get(chara_id)->SetFrameLabel(GetFrame(), GetFrameCount()); + data_test_mot_dw_array_get(rctrl)->SetFrameLabel(GetFrame(), GetFrameCount()); } - if (change_motion) - change_motion = false; + if (reset_osage_flag) + reset_osage_flag = false; - if (rob_chara_array_check_visibility(chara_id) != disp) - rob_chara_array_set_visibility(chara_id, disp); + if (rob_man->get_disp_on(rctrl) != display) + rob_man->set_disp_on(rctrl, display); rob_chr->rob_info_ctrl(); while (set_motion_index < set_motion.size()) { - if (set_motion.data()[set_motion_index].motion_id != motion_id) { + if (set_motion.data()[set_motion_index].motnum != uid) { set_motion_index++; continue; } @@ -1269,8 +1273,8 @@ bool DtmMot::ctrl() { if (frame > this->frame) break; - rob_chr->set_motion_reset_data(motion_id, frame); - rob_chr->set_motion_skin_param(motion_id, frame); + rob_chr->set_motion_reset_data(uid, frame); + rob_chr->set_motion_skin_param(uid, frame); set_motion_index++; } } break; @@ -1283,25 +1287,25 @@ bool DtmMot::dest() { return true; pv_osage_manager_array_set_not_reset_true(); - if (skin_param_manager_check_task_ready(chara_id) + if (skin_param_manager_check_task_ready(rctrl) || pv_osage_manager_array_get_disp() || osage_play_data_manager_check_task_ready()) return false; task_rob_manager_run_task(); task_wind_run_task(); - if (rob_chara_array_get(chara_id)) - rob_chara_array_free_chara_id(chara_id); - motion_set_unload_motion(motion_set_id); - motion_set_unload_mothead(motion_set_id); - skin_param_manager_reset(chara_id); + if (rob_man->get_rob(rctrl)) + rob_man->dest_rob(rctrl); + motion_set_unload_motion(set); + motion_set_unload_mothead(set); + skin_param_manager_reset(rctrl); stage_param_data_coli_data_reset(); osage_play_data_manager_reset(); set_motion.clear(); set_motion_index = 0; dsc_file_handler.reset(); pv_data.reset(); - rob_bone_data = 0; + motion = 0; state = 1; return true; } @@ -1312,7 +1316,7 @@ void DtmMot::basic() { int32_t step_index = 3; for (int32_t i = 0; i < 4; i++) - if (frame < divide[i]) { + if (frame < div[i]) { step_index = i; break; } @@ -1322,13 +1326,13 @@ void DtmMot::basic() { delta_frame = get_delta_frame() * step[step_index]; looped = false; - if (play) + if (move) frame += delta_frame; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_man->get_rob(rctrl); float_t begin = 0.0f; - float_t end = rob_chr->data.motdata.field_0.frame; + float_t end = rob_chr->rob_base.motdata.frame; if (ab_loop) { begin = ab_frame[0]; end = ab_frame[1]; @@ -1349,7 +1353,7 @@ void DtmMot::basic() { else if (loop) { looped = true; frame -= end; - frame += rob_chr->data.motdata.field_0.loop_begin; + frame += rob_chr->rob_base.motdata.loop_begin; } else frame = end; @@ -1358,32 +1362,30 @@ void DtmMot::basic() { this->frame = frame; } -bool DtmMot::add_task(CHARA_NUM chara_num, - int32_t cos_id, uint32_t motion_set_index, uint32_t motion_index) { +bool DtmMot::add_task(CHARA_NUM chr, int32_t ptr, uint32_t set, uint32_t uid) { if (app::TaskWork::has_task(this) || app::TaskWork::check_task_ready(this)) return true; - this->chara_num = chara_num; - this->cos_id = cos_id; - this->motion_index = motion_index; - this->motion_set_index = motion_set_index; - type = 0; + this->chr = chr; + this->ptr = ptr; + this->uid = uid; + this->set = set; + assign = IDX; return app::TaskWork::add_task(this, "DATA_TEST_MOTION_MANAGER", 0); } -bool DtmMot::add_task(CHARA_NUM chara_num, - int32_t cos_id, uint32_t motion_id) { +bool DtmMot::add_task(CHARA_NUM chr, int32_t ptr, uint32_t uid) { if (app::TaskWork::has_task(this) || app::TaskWork::check_task_ready(this)) return true; data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - this->chara_num = chara_num; - this->cos_id = cos_id; - this->motion_id = motion_id; - this->motion_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motion_id); - type = 1; + this->chr = chr; + this->ptr = ptr; + this->uid = uid; + this->set = aft_mot_db->get_motion_set_id_by_motion_id(uid); + assign = UID; return app::TaskWork::add_task(this, "DATA_TEST_MOTION_MANAGER", 0); } @@ -1394,21 +1396,21 @@ bool DtmMot::del_task() { } bool DtmMot::CheckFirstFrame() { - if (rob_bone_data) + if (motion) return false; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_man->get_rob(rctrl); if (!rob_chr) return false; - float_t frame_count = rob_chr->data.motdata.field_0.frame + pre_offset + post_offset; - if (frame_count > 0.0f) - return fabsf(frame_count - frame) <= 0.000001f; + float_t frame_max = rob_chr->rob_base.motdata.frame + pre_offset + post_offset; + if (frame_max > 0.0f) + return fabsf(frame_max - frame) <= 0.000001f; return false; } void DtmMot::CtrlFaceMot() { - DataTestFaceMotDw* face_mot_dw = data_test_face_mot_dw_array_get(chara_id); + DataTestFaceMotDw* face_mot_dw = data_test_face_mot_dw_array_get(rctrl); if (!face_mot_dw || !face_mot_dw->GetEnable()) return; @@ -1416,14 +1418,14 @@ void DtmMot::CtrlFaceMot() { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; DataTestFaceMotDw::Data data = face_mot_dw->GetData(); - rob_chara* rob_chr = rob_chara_array_get(chara_id); - rob_chr->set_face_mottbl_motion(0, data.face.mottbl_index, data.face.frame * 0.01f, + rob_chara* rob_chr = rob_man->get_rob(rctrl); + rob_chr->set_face_mottbl_motion(0, data.face.mottbl_type, data.face.frame * 0.01f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, false, aft_mot_db); - rob_chr->set_eyelid_mottbl_motion(0, data.eyelid.mottbl_index, data.eyelid.frame * 0.01f, + rob_chr->set_eyelid_mottbl_motion(0, data.eyelid.mottbl_type, data.eyelid.frame * 0.01f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_eyes_mottbl_motion(0, data.eyes.mottbl_index, data.eyes.frame * 0.01f, + rob_chr->set_eyes_mottbl_motion(0, data.eyes.mottbl_type, data.eyes.frame * 0.01f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_mouth_mottbl_motion(0, data.mouth.mottbl_index, data.mouth.frame * 0.01f, + rob_chr->set_mouth_mottbl_motion(0, data.mouth.mottbl_type, data.mouth.frame * 0.01f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); } @@ -1440,8 +1442,8 @@ float_t DtmMot::GetFrame() { } float_t DtmMot::GetFrameCount() { - if (state == 13 && rob_bone_data) - return rob_bone_data->get_frame_count(); + if (state == 13 && motion) + return motion->get_frame_max(); return 0.0f; } @@ -1471,16 +1473,16 @@ void DtmMot::SetABFrame(bool a) { } void DtmMot::SetChangeMotion() { - change_motion = true; + reset_osage_flag = true; } void DtmMot::SetDisp(bool value) { - disp = value; + display = value; } void DtmMot::SetDivide(int32_t index, float_t value) { if (index < 3) - divide[index] = value; + div[index] = value; } void DtmMot::SetFrame(float_t value) { @@ -1491,24 +1493,24 @@ void DtmMot::SetLoop(bool value) { loop = value; } -void DtmMot::SetMotion(uint32_t motion_set_index, uint32_t motion_index) { +void DtmMot::SetMotion(uint32_t set, uint32_t uid) { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; state = 0; - if (motion_set_index >= aft_mot_db->motion_set.size()) + if (set >= aft_mot_db->motion_set.size()) return; - const motion_set_info* set_info = &aft_mot_db->motion_set[motion_set_index]; - motion_set_id = set_info->id; + const motion_set_info* set_info = &aft_mot_db->motion_set[set]; + this->set = set_info->id; - if (motion_index >= set_info->motion.size()) + if (uid >= set_info->motion.size()) return; state = 7; frame = 0.0f; - motion_id = set_info->motion[motion_index].id; + this->uid = set_info->motion[uid].id; } void DtmMot::SetOffset(float_t pre_offset, float_t post_offset) { @@ -1517,7 +1519,7 @@ void DtmMot::SetOffset(float_t pre_offset, float_t post_offset) { } void DtmMot::SetPlay(bool value) { - play = value; + move = value; } void DtmMot::SetPartialMot(bool value) { @@ -1529,7 +1531,7 @@ void DtmMot::SetResetMot() { } void DtmMot::SetRotationY(float_t value) { - rotation.y = value; + rot[1] = value; } void DtmMot::SetSaveOnlyStartFrame(bool value) { @@ -1546,7 +1548,7 @@ void DtmMot::SetStep(int32_t index, float_t value) { } void DtmMot::SetTrans(const vec3& value) { - trans = value; + pos = value; } void DtmMot::SetUseOpd(bool value) { @@ -1562,23 +1564,23 @@ void DtmMot::ToggleABLoop() { } void DtmMot::UpdateABFrame() { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = rob_man->get_rob(rctrl); if (!rob_chr) return; - float_t v3 = rob_chr->data.motdata.field_0.frame; + float_t frame = rob_chr->rob_base.motdata.frame; for (float_t& i : ab_frame) - i = clamp_def(i, 0.0f, v3); + i = clamp_def(i, 0.0f, frame); if (ab_frame[0] < ab_frame[1]) return; bool found = false; float_t a_frame = ab_frame[0]; - int32_t b_frame = (int32_t)v3; + int32_t b_frame = (int32_t)frame; for (pv_data_set_motion& i : set_motion) - if (i.motion_id == motion_id && i.frame_stage_index.first > a_frame) { + if (i.motnum == uid && i.frame_stage_index.first > a_frame) { if ((int32_t)i.frame_stage_index.first) { b_frame = (int32_t)i.frame_stage_index.first; found = true; @@ -1587,7 +1589,7 @@ void DtmMot::UpdateABFrame() { } if (!found) - b_frame = (int32_t)v3; + b_frame = (int32_t)frame; ab_frame[1] = (float_t)b_frame; } @@ -1674,16 +1676,16 @@ void motion_test_free() { } bool dtm_mot_array_get_loaded() { - return dtm_mot_array[0].GetLoaded() && dtm_mot_array[1].GetLoaded(); + return dtm_mot_array[ROB_ID_1P].GetLoaded() && dtm_mot_array[ROB_ID_2P].GetLoaded(); } void dtm_mot_array_set_reset_mot() { - dtm_mot_array[0].SetResetMot(); - dtm_mot_array[1].SetResetMot(); + dtm_mot_array[ROB_ID_1P].SetResetMot(); + dtm_mot_array[ROB_ID_2P].SetResetMot(); } -DataTestFaceMotDw::DataTestFaceMotDw(int32_t chara_id) { - this->chara_id = chara_id; +DataTestFaceMotDw::DataTestFaceMotDw(ROB_ID id) { + rob_id = id; SetText("Face motion"); @@ -1740,7 +1742,7 @@ DataTestFaceMotDw::~DataTestFaceMotDw() { } void DataTestFaceMotDw::Hide() { - data_test_face_mot_dw_array[chara_id] = 0; + data_test_face_mot_dw_array[rob_id] = 0; dw::Shell::Hide(); } @@ -1754,17 +1756,17 @@ void DataTestFaceMotDw::AddMottblMapMotions(dw::ListBox* list_box, int32_t type) list_box->ClearItems(); - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (!rob_chr) return; switch (type) { case 0: - for (int32_t i = 6; i <= 130; i++) { - uint32_t motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(i); - if (motion_id != -1) { - if (motion_id_mottbl_map.insert({ motion_id, i }).second) { - std::string motion_name(aft_mot_db->get_motion_name(motion_id)); + for (uint32_t i = MTP_FACE_NULL; i <= MTP_FACE_NEW_IKARI_OLD_CL; i++) { + uint32_t uid = rob_chr->get_common_mot((MOTTABLE_TYPE)i); + if (uid != -1) { + if (motion_id_mottbl_map.insert({ uid, (MOTTABLE_TYPE)i }).second) { + std::string motion_name(aft_mot_db->get_motion_name(uid)); if (motion_name.rfind("_CL") != motion_name.size() - 3) list_box->AddItem(motion_name); } @@ -1772,20 +1774,20 @@ void DataTestFaceMotDw::AddMottblMapMotions(dw::ListBox* list_box, int32_t type) } break; case 1: - for (int32_t i = 165; i <= 191; i++) { - uint32_t motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(i); - if (motion_id != -1) { - motion_id_mottbl_map.insert({ motion_id, i }); - list_box->AddItem(aft_mot_db->get_motion_name(motion_id)); + for (uint32_t i = MTP_EYES_NULL; i <= MTP_EYES_MOVE_UR_DL_OLD; i++) { + uint32_t uid = rob_chr->get_common_mot((MOTTABLE_TYPE)i); + if (uid != -1) { + motion_id_mottbl_map.insert({ uid, (MOTTABLE_TYPE)i }); + list_box->AddItem(aft_mot_db->get_motion_name(uid)); } } break; case 2: - for (int32_t i = 131; i <= 164; ++i) { - uint32_t motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(i); - if (motion_id != -1) { - motion_id_mottbl_map.insert({ motion_id, i }); - list_box->AddItem(aft_mot_db->get_motion_name(motion_id)); + for (uint32_t i = MTP_KUCHI_NULL; i <= MTP_KUCHI_NEUTRAL; ++i) { + uint32_t uid = rob_chr->get_common_mot((MOTTABLE_TYPE)i); + if (uid != -1) { + motion_id_mottbl_map.insert({ uid, (MOTTABLE_TYPE)i }); + list_box->AddItem(aft_mot_db->get_motion_name(uid)); } } break; @@ -1802,10 +1804,10 @@ DataTestFaceMotDw::Data DataTestFaceMotDw::GetData() { motion_database* aft_mot_db = &aft_data->data_ft.mot_db; DataTestFaceMotDw::Data data = { - { 6, 0.0f }, - { 6, 0.0f }, - { 165, 0.0f }, - { 131, 0.0f }, + { MTP_FACE_NULL , 0.0f }, + { MTP_FACE_NULL , 0.0f }, + { MTP_EYES_NULL , 0.0f }, + { MTP_KUCHI_NULL, 0.0f }, }; std::string face_mot = face->GetSelectedItemStr(); @@ -1837,10 +1839,10 @@ bool DataTestFaceMotDw::GetEnable() { } inline void DataTestFaceMotDw::GetMottblIndexFrame( - DataTestFaceMotDw::MotionData& data, uint32_t motion_id, float_t value) { - auto elem = motion_id_mottbl_map.find(motion_id); + DataTestFaceMotDw::MotionData& data, uint32_t uid, float_t value) { + auto elem = motion_id_mottbl_map.find(uid); if (elem != motion_id_mottbl_map.end()) - data.mottbl_index = elem->second; + data.mottbl_type = elem->second; data.frame = value; } @@ -1885,16 +1887,16 @@ void DataTestMotDw::CharaListBoxProc::Callback(dw::SelectionListener::CallbackDa DataTestMot::Data* test_mot_data = data_test_mot_data_get(); dw::ListBox* list_box = dynamic_cast(data->widget); if (list_box) { - int32_t chara_id = list_box->callback_data.i32; - CHARA_NUM chara_num = (CHARA_NUM)list_box->list->selected_item; - test_mot_data->chara_num[chara_id] = chara_num; + ROB_ID rob_id = (ROB_ID)list_box->callback_data.i32; + CHARA_NUM chr = (CHARA_NUM)list_box->list->selected_item; + test_mot_data->chr[rob_id] = chr; - DataTestMotDw* test_mot_dw = data_test_mot_dw_array_get(chara_id); + DataTestMotDw* test_mot_dw = data_test_mot_dw_array_get(rob_id); if (test_mot_dw->set_change_button->value) { data_struct* aft_data = &data_list[DATA_AFT]; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - uint32_t set_id = get_rob_data(chara_num)->motfile; + uint32_t set_id = get_rob_data(chr)->motfile; uint32_t set_index = -1; for (const motion_set_info& i : aft_mot_db->motion_set) if (i.id == set_id) { @@ -1903,10 +1905,10 @@ void DataTestMotDw::CharaListBoxProc::Callback(dw::SelectionListener::CallbackDa } test_mot_dw->c_type_list_box_proc.list_box->SetItemIndex(set_index); - test_mot_data->motion_set_index[chara_id] = set_index; + test_mot_data->set[rob_id] = set_index; } - test_mot_dw->AddModules(chara_id, test_mot_dw->chara_list_box_proc.list_box); + test_mot_dw->AddModules(rob_id, test_mot_dw->chara_list_box_proc.list_box); } } @@ -1929,7 +1931,7 @@ void DataTestMotDw::CTypeListBoxProc::Callback(dw::SelectionListener::CallbackDa size_t end = str.find(')'); if (end != -1) - test_mot_data->cos_id[list_box->callback_data.i32] = + test_mot_data->ptr[list_box->callback_data.i32] = atoi(str.substr(start, end - start).c_str()) - 1; } } @@ -1947,9 +1949,9 @@ void DataTestMotDw::SetListBoxProc::Callback(dw::SelectionListener::CallbackData DataTestMot::Data* test_mot_data = data_test_mot_data_get(); dw::ListBox* list_box = dynamic_cast(data->widget); if (list_box) { - int32_t chara_id = list_box->callback_data.i32; - test_mot_data->motion_set_index[chara_id] = (int32_t)list_box->list->selected_item; - data_test_mot_dw_array_get(chara_id)->ResetFrame(); + ROB_ID rob_id = (ROB_ID)list_box->callback_data.i32; + test_mot_data->set[rob_id] = (int32_t)list_box->list->selected_item; + data_test_mot_dw_array_get(rob_id)->ResetFrame(); } } @@ -1965,9 +1967,9 @@ void DataTestMotDw::IdListBoxProc::Callback(dw::SelectionListener::CallbackData* DataTestMot::Data* test_mot_data = data_test_mot_data_get(); dw::ListBox* list_box = dynamic_cast(data->widget); if (list_box) { - int32_t chara_id = list_box->callback_data.i32; - test_mot_data->motion_index[chara_id] = (int32_t)list_box->list->selected_item; - data_test_mot_dw_array_get(chara_id)->ResetFrame(); + ROB_ID rob_id = (ROB_ID)list_box->callback_data.i32; + test_mot_data->uid[rob_id] = (int32_t)list_box->list->selected_item; + data_test_mot_dw_array_get(rob_id)->ResetFrame(); } } @@ -2013,11 +2015,12 @@ void DataTestMotDw::FrameSliderProc::Callback(dw::SelectionListener::CallbackDat DataTestMot::Data* test_mot_data = data_test_mot_data_get(); dw::Slider* slider = dynamic_cast(data->widget); if (slider) { + ROB_ID rob_id = (ROB_ID)slider->callback_data.i32; float_t frame = slider->GetValue(); - data_test_mot_dw_array_get(slider->callback_data.i32)->dtm_mot->SetFrame(frame); + data_test_mot_dw_array_get(rob_id)->dtm_mot->SetFrame(frame); if (test_mot_data->sync_frame) { - dtm_mot_array[0].SetFrame(frame); - dtm_mot_array[1].SetFrame(frame); + dtm_mot_array[ROB_ID_1P].SetFrame(frame); + dtm_mot_array[ROB_ID_2P].SetFrame(frame); } } } @@ -2047,8 +2050,10 @@ DataTestMotDw::DispButtonProc::~DispButtonProc() { void DataTestMotDw::DispButtonProc::Callback(dw::SelectionListener::CallbackData* data) { dw::Button* button = dynamic_cast(data->widget); - if (button) - data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetDisp(button->value); + if (button) { + ROB_ID rob_id = (ROB_ID)button->callback_data.i32; + data_test_mot_dw_array_get(rob_id)->dtm_mot->SetDisp(button->value); + } } DataTestMotDw::UseOpdButtonProc::UseOpdButtonProc() { @@ -2061,8 +2066,10 @@ DataTestMotDw::UseOpdButtonProc::~UseOpdButtonProc() { void DataTestMotDw::UseOpdButtonProc::Callback(dw::SelectionListener::CallbackData* data) { dw::Button* button = dynamic_cast(data->widget); - if (button) - data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetUseOpd(button->value); + if (button) { + ROB_ID rob_id = (ROB_ID)button->callback_data.i32; + data_test_mot_dw_array_get(rob_id)->dtm_mot->SetUseOpd(button->value); + } } DataTestMotDw::PartialMotButtonProc::PartialMotButtonProc() { @@ -2075,8 +2082,10 @@ DataTestMotDw::PartialMotButtonProc::~PartialMotButtonProc() { void DataTestMotDw::PartialMotButtonProc::Callback(dw::SelectionListener::CallbackData* data) { dw::Button* button = dynamic_cast(data->widget); - if (button) - data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetPartialMot(button->value); + if (button) { + ROB_ID rob_id = (ROB_ID)button->callback_data.i32; + data_test_mot_dw_array_get(rob_id)->dtm_mot->SetPartialMot(button->value); + } } DataTestMotDw::SaveOnlyStartFrameButtonProc::SaveOnlyStartFrameButtonProc() { @@ -2089,8 +2098,10 @@ DataTestMotDw::SaveOnlyStartFrameButtonProc::~SaveOnlyStartFrameButtonProc() { void DataTestMotDw::SaveOnlyStartFrameButtonProc::Callback(dw::SelectionListener::CallbackData* data) { dw::Button* button = dynamic_cast(data->widget); - if (button) - data_test_mot_dw_array_get(button->callback_data.i32)->dtm_mot->SetSaveOnlyStartFrame(button->value); + if (button) { + ROB_ID rob_id = (ROB_ID)button->callback_data.i32; + data_test_mot_dw_array_get(rob_id)->dtm_mot->SetSaveOnlyStartFrame(button->value); + } } DataTestMotDw::CreateFaceMotDwProc::CreateFaceMotDwProc() { @@ -2103,8 +2114,10 @@ DataTestMotDw::CreateFaceMotDwProc::~CreateFaceMotDwProc() { void DataTestMotDw::CreateFaceMotDwProc::Callback(dw::SelectionListener::CallbackData* data) { dw::Button* button = dynamic_cast(data->widget); - if (button) - data_test_face_mot_dw_array_init(button->callback_data.i32); + if (button) { + ROB_ID rob_id = (ROB_ID)button->callback_data.i32; + data_test_face_mot_dw_array_init(rob_id); + } } DataTestMotDw::CreateEqDwProc::CreateEqDwProc() { @@ -2131,13 +2144,13 @@ void DataTestMotDw::CreateDebugCamProc::Callback(dw::SelectionListener::Callback //set_debug_camera_set_mode_lock(); } -DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { +DataTestMotDw::DataTestMotDw(ROB_ID id, DtmMot* dtm_mot) { this->dtm_mot = dtm_mot; DataTestMot::Data* test_mot_data = data_test_mot_data_get(); char buf[0x20]; - sprintf_s(buf, sizeof(buf), "MOTION TEST %dP", chara_id + 1); + sprintf_s(buf, sizeof(buf), "MOTION TEST %dP", id + 1); SetText(buf); dw::Composite* chara_comp = new dw::Composite(this); @@ -2151,8 +2164,8 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { chara->SetMaxItems(20); for (int32_t i = 0; i < CN_MAX; i++) chara->AddItem(get_chara_name_full((CHARA_NUM)i)); - chara->callback_data.i32 = chara_id; - chara->SetItemIndex(test_mot_data->chara_num[chara_id]); + chara->callback_data.i32 = id; + chara->SetItemIndex(test_mot_data->chr[id]); chara->AddSelectionListener(&chara_list_box_proc); chara->SetFont(dw::p_font_type_6x12); @@ -2162,10 +2175,10 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { chara_list_box_proc.list_box = new dw::ListBox(chara_list_box_comp); chara_list_box_proc.list_box->SetMaxItems(40); chara_list_box_proc.list_box->SetFont(dw::p_font_type_6x12); - AddModules(chara_id, chara_list_box_proc.list_box); - chara_list_box_proc.list_box->callback_data.i32 = chara_id; + AddModules(id, chara_list_box_proc.list_box); + chara_list_box_proc.list_box->callback_data.i32 = id; - chara_list_box_proc.list_box->SetItemIndex(test_mot_data->cos_id[chara_id]); + chara_list_box_proc.list_box->SetItemIndex(test_mot_data->ptr[id]); chara_list_box_proc.list_box->AddSelectionListener(&c_type_list_box_proc); chara_list_box_proc.list_box->SetFont(dw::p_font_type_6x12); @@ -2183,9 +2196,9 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { for (motion_set_info& i : aft_mot_db->motion_set) c_type_list_box_proc.list_box->AddItem(i.name); c_type_list_box_proc.list_box->SetMaxItems(40); - c_type_list_box_proc.list_box->callback_data.i32 = chara_id; + c_type_list_box_proc.list_box->callback_data.i32 = id; - c_type_list_box_proc.list_box->SetItemIndex(test_mot_data->motion_set_index[chara_id]); + c_type_list_box_proc.list_box->SetItemIndex(test_mot_data->set[id]); c_type_list_box_proc.list_box->AddSelectionListener(&set_list_box_proc); c_type_list_box_proc.list_box->SetFont(dw::p_font_type_6x12); @@ -2198,22 +2211,22 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { set_list_box_proc.list_box = new dw::ListBox(id_comp); set_list_box_proc.list_box->SetMaxItems(40); - set_list_box_proc.list_box->callback_data.i32 = chara_id; + set_list_box_proc.list_box->callback_data.i32 = id; set_list_box_proc.list_box->AddSelectionListener(&id_list_box_proc); set_list_box_proc.list_box->SetFont(dw::p_font_type_6x12); rotate_slider = dw::Slider::Create(this); rotate_slider->SetText("Y ROT"); rotate_slider->format = "%3.0f"; - rotate_slider->SetParams(test_mot_data->rot_y[chara_id], -180.0f, 180.0f, 36.0f, 1.0f, 10.0f); - rotate_slider->callback_data.i32 = chara_id; + rotate_slider->SetParams(test_mot_data->rot_y[id], -180.0f, 180.0f, 36.0f, 1.0f, 10.0f); + rotate_slider->callback_data.i32 = id; rotate_slider->AddSelectionListener(&rotate_slider_proc); position_slider = dw::Slider::Create(this); position_slider->dw::Widget::SetText("X POS"); position_slider->format = "%3.2f"; - position_slider->SetParams(test_mot_data->trans_x[chara_id], -2.0f, 2.0f, 0.4f, 0.01f, 0.1f); - position_slider->callback_data.i32 = chara_id; + position_slider->SetParams(test_mot_data->trans_x[id], -2.0f, 2.0f, 0.4f, 0.01f, 0.1f); + position_slider->callback_data.i32 = id; position_slider->AddSelectionListener(&position_slider_proc); dw::Group* frame_group = new dw::Group(this); @@ -2226,8 +2239,8 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { sprintf_s(buf, sizeof(buf), "STEP %02d", i); step_slider->SetText(buf); step_slider->format = "%4.4f"; - step_slider->SetParams(test_mot_data->step[chara_id].array[i], -3.0f, 3.0f, 0.4f, 0.01f, 0.1f); - step_slider->callback_data.i32 = chara_id; + step_slider->SetParams(test_mot_data->step[id].array[i], -3.0f, 3.0f, 0.4f, 0.01f, 0.1f); + step_slider->callback_data.i32 = id; step_slider_proc[i].index = i; step_slider->AddSelectionListener(&step_slider_proc[i]); } @@ -2243,21 +2256,21 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { dw::Label* frame_separator = new dw::Label(frame_comp); frame_separator->SetText(" / "); - frame_count = new dw::Label(frame_comp, dw::FLAG_4000); - frame_count->SetText("00000.0000"); + frame_max = new dw::Label(frame_comp, dw::FLAG_4000); + frame_max->SetText("00000.0000"); current = dw::Slider::Create(frame_group); current->SetText("Current"); current->format = "%4.0f"; current->SetParams(0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); - current->callback_data.i32 = chara_id; + current->callback_data.i32 = id; current->AddSelectionListener(&frame_slider_proc); start_frame_slider = dw::Slider::Create(frame_group); start_frame_slider->SetText("Start "); start_frame_slider->format = "%4.0f"; start_frame_slider->SetParams(0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); - start_frame_slider->callback_data.i32 = chara_id; + start_frame_slider->callback_data.i32 = id; start_frame_slider->AddSelectionListener(&start_frame_slider_proc); dw::Composite* start_ctrl_comp = new dw::Composite(frame_group); @@ -2313,7 +2326,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { disp_button->SetText("DISP "); disp_button->SetValue(true); disp_button->AddSelectionListener(&disp_button_proc); - disp_button->callback_data.i32 = chara_id; + disp_button->callback_data.i32 = id; disp_button->SetFont(dw::p_font_type_6x12); set_change_button = new dw::Button(rob_comp, dw::CHECKBOX); @@ -2327,7 +2340,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { dw::Button* reate_face_mot_dw = new dw::Button(var_comp); reate_face_mot_dw->SetText(" FACE MOT "); reate_face_mot_dw->AddSelectionListener(&create_face_mot_dw_proc); - reate_face_mot_dw->callback_data.i32 = chara_id; + reate_face_mot_dw->callback_data.i32 = id; reate_face_mot_dw->SetFont(dw::p_font_type_6x12); dw::Button* create_eq_dw = new dw::Button(var_comp); @@ -2344,7 +2357,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { use_opd_button->SetText("USE OSAGE PLAY DATA"); use_opd_button->SetValue(false); use_opd_button->AddSelectionListener(&use_opd_button_proc); - use_opd_button->callback_data.i32 = chara_id; + use_opd_button->callback_data.i32 = id; use_opd_button->SetFont(dw::p_font_type_6x12); dtm_mot->SetPartialMot(false); @@ -2359,7 +2372,7 @@ DataTestMotDw::DataTestMotDw(int32_t chara_id, DtmMot* dtm_mot) { save_only_start_frame_button->SetText(save_only_start_frame_button_text); save_only_start_frame_button->SetValue(false); save_only_start_frame_button->AddSelectionListener(&save_only_start_frame_button_proc); - save_only_start_frame_button->callback_data.i32 = chara_id; + save_only_start_frame_button->callback_data.i32 = id; save_only_start_frame_button->SetFont(dw::p_font_type_6x12); UpdateLayout(); @@ -2395,8 +2408,8 @@ void DataTestMotDw::AddID(const char* str) { set_list_box_proc.list_box->AddItem(str); } -void DataTestMotDw::SetFrameSlider(float_t frame, float_t frame_count) { - float_t last_frame = frame_count - 1.0f; +void DataTestMotDw::SetFrameSlider(float_t frame, float_t frame_max) { + float_t last_frame = frame_max - 1.0f; current->SetParams(min_def(frame, last_frame), 0.0f, last_frame, last_frame * 0.1f, 1.0f, 10.0f); float_t _frame = clamp_def(start_frame_slider->GetValue(), 0.0f, last_frame); @@ -2405,16 +2418,16 @@ void DataTestMotDw::SetFrameSlider(float_t frame, float_t frame_count) { data_test_mot_data_get()->start_frame[start_frame_slider->callback_data.i32] = _frame; } -void DataTestMotDw::SetFrameLabel(float_t frame, float_t frame_count) { +void DataTestMotDw::SetFrameLabel(float_t frame, float_t frame_max) { char buf[0x40]; sprintf_s(buf, sizeof(buf), "%10.4f", frame); this->frame->SetText(buf); - sprintf_s(buf, sizeof(buf), "%7.1f", frame_count); - this->frame_count->SetText(buf); + sprintf_s(buf, sizeof(buf), "%7.1f", frame_max); + this->frame_max->SetText(buf); } -void DataTestMotDw::AddModules(int32_t chara_id, dw::ListBox* list_box) { +void DataTestMotDw::AddModules(ROB_ID id, dw::ListBox* list_box) { if (!list_box) return; @@ -2422,14 +2435,14 @@ void DataTestMotDw::AddModules(int32_t chara_id, dw::ListBox* list_box) { list_box->ClearItems(); - CHARA_NUM chara_num = test_mot_data->chara_num[chara_id]; - const char* chara_name = get_chara_name(chara_num); + CHARA_NUM chr = test_mot_data->chr[id]; + const char* chara_name = get_chara_name(chr); const std::vector& modules = module_data_handler_data_get_modules(); - for (auto& i : item_table_handler_array_get_table(chara_num)->cos) { + for (auto& i : get_rob_item_header(chr)->defset) { bool found = false; for (const module_data& j : modules) - if (chara_num == j.chara_num && i.first == j.cos) { + if (chr == j.chara_num && i.first == j.cos) { char buf[0x200]; sprintf_s(buf, sizeof(buf), "%03d:(%s%03d)%s", j.id, chara_name, i.first + 1, j.name.c_str()); list_box->AddItem(buf); @@ -2438,18 +2451,19 @@ void DataTestMotDw::AddModules(int32_t chara_id, dw::ListBox* list_box) { break; } - if (!found && i.second.data.outer) { - const item_table_item* item = item_table_handler_array_get_item(chara_num, i.second.data.outer); - if (item) { + if (!found && i.second.item_no[ROB_ITEM_EQUIP_SUB_ID_OUTER]) { + const RobItemTable* tbl = get_rob_item_table( + chr, i.second.item_no[ROB_ITEM_EQUIP_SUB_ID_OUTER]); + if (tbl) { char buf[0x200]; - sprintf_s(buf, sizeof(buf), "---:(%s%03d)%s", chara_name, i.first + 1, item->name.c_str()); + sprintf_s(buf, sizeof(buf), "---:(%s%03d)%s", chara_name, i.first + 1, tbl->name.c_str()); list_box->AddItem(buf); } } } - int32_t cos_id = test_mot_data->cos_id[chara_id]; - list_box->SetItemIndex(cos_id < list_box->GetItemCount() ? cos_id : 0); + int32_t ptr = test_mot_data->ptr[id]; + list_box->SetItemIndex(ptr < list_box->GetItemCount() ? ptr : 0); } void DataTestMotDw::ResetFrame() { @@ -2501,7 +2515,7 @@ void DataTestMotDw::StartCtrlLeftRightCallback(dw::Widget* data) { auto i_begin = set_motion.begin(); auto i_end = set_motion.end(); for (auto i = i_begin; i != i_end; ) - if (i->motion_id != test_mot_dw->dtm_mot->motion_id) { + if (i->motnum != test_mot_dw->dtm_mot->uid) { for (auto j = i, k = i - 1; k != i_end; j++, k++) *j = *k; @@ -2517,7 +2531,7 @@ void DataTestMotDw::StartCtrlLeftRightCallback(dw::Widget* data) { float_t last = 0.0f; float_t first = -1.0f; for (pv_data_set_motion& i : set_motion) { - if (i.motion_id == test_mot_dw->dtm_mot->motion_id) + if (i.motnum == test_mot_dw->dtm_mot->uid) if (&i != set_motion.data()) last = i.frame_stage_index.first; if (frame < i.frame_stage_index.first) { @@ -2860,8 +2874,8 @@ void DataTestMotCtrlDw::Draw() { default: { test_mot_data->type = 0; - if (dtm_mot_array[0].motion_set_id != -1) { - std::string motion_set_name(aft_mot_db->get_motion_set_name(dtm_mot_array[0].motion_set_id)); + if (dtm_mot_array[ROB_ID_1P].set != -1) { + std::string motion_set_name(aft_mot_db->get_motion_set_name(dtm_mot_array[ROB_ID_1P].set)); const char* v13[] = { "CMN", @@ -2935,22 +2949,22 @@ static void data_test_mot_a3d_set_auth_3d(std::string& value) { data_test_mot_a3d_get()->SetAuth3d(value); } -static void data_test_mot_dw_array_init(int32_t chara_id, DtmMot* dtm_mot) { - if (data_test_mot_dw_array[chara_id]) { - data_test_mot_dw_array[chara_id]->Disp(); +static void data_test_mot_dw_array_init(ROB_ID id, DtmMot* dtm_mot) { + if (data_test_mot_dw_array[id]) { + data_test_mot_dw_array[id]->Disp(); return; } - DataTestMotDw* test_mot_dw = new DataTestMotDw(chara_id, dtm_mot); - data_test_mot_dw_array[chara_id] = test_mot_dw; + DataTestMotDw* test_mot_dw = new DataTestMotDw(id, dtm_mot); + data_test_mot_dw_array[id] = test_mot_dw; test_mot_dw->LimitPosDisp(); - switch (chara_id) { - case 0: { + switch (id) { + case ROB_ID_1P: { test_mot_dw->rect.pos.y += 14.0f; } break; - case 1: { + case ROB_ID_2P: { ScreenParam& screen_param = get_screen_param(); test_mot_dw->rect.pos.x = (float_t)screen_param.width - test_mot_dw->rect.size.x; test_mot_dw->rect.pos.y = (float_t)screen_param.height - 24.0f; @@ -2958,8 +2972,8 @@ static void data_test_mot_dw_array_init(int32_t chara_id, DtmMot* dtm_mot) { } } -static DataTestMotDw* data_test_mot_dw_array_get(int32_t chara_id) { - return data_test_mot_dw_array[chara_id]; +static DataTestMotDw* data_test_mot_dw_array_get(ROB_ID id) { + return data_test_mot_dw_array[id]; } static void data_test_mot_a3d_dw_init() { @@ -2989,21 +3003,21 @@ static DataTestMotCtrlDw* data_test_mot_ctrl_dw_get() { return data_test_mot_ctrl_dw; } -static void data_test_face_mot_dw_array_init(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX || !rob_chara_array_get(chara_id)) +static void data_test_face_mot_dw_array_init(ROB_ID id) { + if (id < 0 || id >= ROB_ID_MAX || !get_rob_management()->get_rob(id)) return; - if (!data_test_face_mot_dw_array[chara_id]) { - data_test_face_mot_dw_array[chara_id] = new DataTestFaceMotDw(chara_id); - data_test_face_mot_dw_array[chara_id]->LimitPosDisp(); + if (!data_test_face_mot_dw_array[id]) { + data_test_face_mot_dw_array[id] = new DataTestFaceMotDw(id); + data_test_face_mot_dw_array[id]->LimitPosDisp(); } else - data_test_face_mot_dw_array[chara_id]->Disp(); + data_test_face_mot_dw_array[id]->Disp(); } -static DataTestFaceMotDw* data_test_face_mot_dw_array_get(int32_t chara_id) { - if (chara_id >= 0 && chara_id < ROB_ID_MAX) - return data_test_face_mot_dw_array[chara_id]; +static DataTestFaceMotDw* data_test_face_mot_dw_array_get(ROB_ID id) { + if (id >= 0 && id < ROB_ID_MAX) + return data_test_face_mot_dw_array[id]; return 0; } diff --git a/src/ReDIVA/data_test/motion_test.hpp b/src/ReDIVA/data_test/motion_test.hpp index 61898b65..5c22c0cb 100644 --- a/src/ReDIVA/data_test/motion_test.hpp +++ b/src/ReDIVA/data_test/motion_test.hpp @@ -14,16 +14,16 @@ class DataTestMot : public app::Task { public: struct Data { - struct Offset { + struct Off { float_t array[2]; - Offset(); + Off(); }; - struct Divide { + struct Div { float_t array[3]; - Divide(); + Div(); }; struct Step { @@ -32,18 +32,18 @@ public: Step(); }; - CHARA_NUM chara_num[2]; - CHARA_NUM curr_chara_num[2]; - uint32_t cos_id[2]; - uint32_t curr_cos_id[2]; - uint32_t motion_set_index[2]; - uint32_t curr_motion_set_index[2]; - uint32_t motion_index[2]; - uint32_t curr_motion_index[2]; + CHARA_NUM chr[2]; + CHARA_NUM curr_chr[2]; + uint32_t ptr[2]; + uint32_t curr_ptr[2]; + uint32_t set[2]; + uint32_t curr_set[2]; + uint32_t uid[2]; + uint32_t curr_uid[2]; float_t rot_y[2]; float_t trans_x[2]; - Offset offset[2]; - Divide divide[2]; + Off off[2]; + Div div[2]; Step step[2]; float_t start_frame[2]; int32_t type; @@ -102,31 +102,30 @@ public: class DtmMot : public app::Task { public: - rob_chara_bone_data* rob_bone_data; - int32_t chara_id; - int32_t type; - CHARA_NUM chara_num; - int32_t cos_id; - union { - uint32_t motion_set_id; - int32_t motion_set_index; + enum ASSIGN { + IDX = 0, + UID, }; - union { - uint32_t motion_id; - int32_t motion_index; - }; - vec3 trans; - vec3 rotation; - float_t rot_y; + + RobManagement* rob_man; + rob_chara_bone_data* motion; + ROB_ID rctrl; + ASSIGN assign; + CHARA_NUM chr; + int32_t ptr; + uint32_t set; + uint32_t uid; + vec3 pos; + float_t rot[4]; float_t pre_offset; float_t post_offset; float_t step[4]; - float_t divide[3]; + float_t div[3]; bool loop; - bool play; - bool field_D2; - bool change_motion; - bool disp; + bool move; + bool item; + bool reset_osage_flag; + bool display; bool use_opd; bool loaded; bool reset_mot; @@ -152,12 +151,11 @@ public: virtual bool init() override; virtual bool ctrl() override; virtual bool dest() override; + virtual void disp() override; virtual void basic() override; - virtual bool add_task(CHARA_NUM chara_num, - int32_t cos_id, uint32_t motion_set_index, uint32_t motion_index); - virtual bool add_task(CHARA_NUM chara_num, - int32_t cos_id, uint32_t motion_id); + virtual bool add_task(CHARA_NUM chr, int32_t ptr, uint32_t set, uint32_t uid); + virtual bool add_task(CHARA_NUM chr, int32_t ptr, uint32_t uid); virtual bool del_task(); bool CheckFirstFrame(); diff --git a/src/ReDIVA/data_test/opd_test.cpp b/src/ReDIVA/data_test/opd_test.cpp index 7d9c68df..aa7baf2a 100644 --- a/src/ReDIVA/data_test/opd_test.cpp +++ b/src/ReDIVA/data_test/opd_test.cpp @@ -189,9 +189,9 @@ void TaskDataTestOpd::disp() { print_work.printf_align_left("item:\n"); for (uint32_t& j : i.items) { - const item_table_item* item = item_table_handler_array_get_item(i.chara, j); - if (item) - print_work.printf_align_left("%03u %s\n", j, item->name.c_str()); + const RobItemTable* tbl = get_rob_item_table(i.chara, j); + if (tbl) + print_work.printf_align_left("%03u %s\n", j, tbl->name.c_str()); } worker++; } @@ -261,11 +261,11 @@ void TaskDataTestOpd::GetCustomizeItemObjectNames( data_struct* aft_data = &data_list[DATA_AFT]; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - const item_table_item* item = item_table_handler_array_get_item( + const RobItemTable* tbl = get_rob_item_table( cstm.chara != 10 ? (CHARA_NUM)cstm.chara : CN_MIKU, cstm.obj_id); - if (item) - for (const item_table_item_data_obj& i : item->data.obj) - objects.push_back(aft_obj_db->get_object_name(i.obj_info)); + if (tbl) + for (const RobItemDataObj& i : tbl->data.obj) + objects.push_back(aft_obj_db->get_object_name(i.uid)); } bool TaskDataTestOpd::add_task() { diff --git a/src/ReDIVA/data_test/rob_osage_test.cpp b/src/ReDIVA/data_test/rob_osage_test.cpp index 424f6c4a..4a97275e 100644 --- a/src/ReDIVA/data_test/rob_osage_test.cpp +++ b/src/ReDIVA/data_test/rob_osage_test.cpp @@ -425,8 +425,8 @@ extern render_context* rctx_ptr; RobOsageTest::RobOsageTest() : load(), save(), coli(), line(), osage_index(), collision_index(), collision_update() { - chara_id = -1; - load_chara_id = 0; + rob_id = ROB_ID_NULL; + rob_id_load = ROB_ID_1P; chara_num = CN_NONE; cos_id = -1; rpk = RPK_NONE; @@ -449,8 +449,8 @@ bool RobOsageTest::init() { } bool RobOsageTest::ctrl() { - if (chara_id != -1) { - rob_chara* rob_chr = rob_chara_array_get(chara_id); + if (rob_id != ROB_ID_NULL) { + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (!rob_chr) return false; @@ -461,7 +461,7 @@ bool RobOsageTest::ctrl() { if (load) { load = false; - chara_id = load_chara_id; + rob_id = rob_id_load; chara_num = CN_NONE; cos_id = -1; @@ -473,14 +473,14 @@ bool RobOsageTest::ctrl() { rob_osage_test_dw->rob.object_list_box->ClearItems(); rob_osage_test_dw->rob.object_list_box->SetItemIndex(-1); - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (!rob_chr) return false; chara_num = rob_chr->chara_num; cos_id = rob_chr->cos_id; - rob_chara_item_equip* rob_disp = rob_chr->rob_disp; + RobDisp* rob_disp = rob_chr->disp; if (!rob_disp) return false; @@ -489,7 +489,7 @@ bool RobOsageTest::ctrl() { object_database* aft_obj_db = &aft_data->data_ft.obj_db; for (int32_t i = 0; i < RPK_MAX; i++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + RobSkinDisp* skin_disp = rob_disp->get_skin_work((ROB_PARTS_KIND)i); ::obj* obj = objset_info_storage_get_obj(skin_disp->obj_uid); if (!obj || !skin_disp->osage_blk.size() && !skin_disp->cloth.size()) continue; @@ -513,12 +513,12 @@ bool RobOsageTest::ctrl() { std::vector> ex_nodes; ex_nodes.reserve(skin_disp->osage_blk.size() + skin_disp->cloth.size()); - for (ExOsageBlock*& j : skin_disp->osage_blk) { + for (ExOsageBlock* j : skin_disp->osage_blk) { ExOsageBlock* osg = j; ex_nodes.push_back({ osg->name, osg }); } - for (ExClothBlock*& j : skin_disp->cloth) { + for (ExClothBlock* j : skin_disp->cloth) { ExClothBlock* cls = j; ex_nodes.push_back({ cls->name, cls }); } @@ -632,7 +632,7 @@ bool RobOsageTest::ctrl() { const char* flt_fmt = "%0.6f"; - rob_chara_item_equip* rob_disp = rob_chara_array_get_rob_disp(chara_id); + RobDisp* rob_disp = get_rob_management()->get_rob_robdisp_work((ROB_ID)rob_id); if (!rob_disp) return false; @@ -640,10 +640,10 @@ bool RobOsageTest::ctrl() { bone_database* aft_bone_data = &aft_data->data_ft.bone_data; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - const std::vector* object_bones = aft_bone_data->get_bone_name(BONE_KIND_CMN); + const std::vector* bone_name_table = aft_bone_data->get_bone_name_table(BONE_KIND_CMN); for (int32_t i = 0; i < RPK_MAX; i++) { - rob_chara_item_equip_object* skin_disp = rob_disp->get_skin_disp((ROB_PARTS_KIND)i); + RobSkinDisp* skin_disp = rob_disp->get_skin_work((ROB_PARTS_KIND)i); ::obj* obj = objset_info_storage_get_obj(skin_disp->obj_uid); if (!obj || !skin_disp->osage_blk.size() && !skin_disp->cloth.size()) continue; @@ -771,7 +771,7 @@ bool RobOsageTest::ctrl() { kv.open_scope_fmt(sort_index_data[k]); SkinParam::CollisionParam* cls_param = &vc[sort_index_data[k]]; - kv.write(s, "bone.0.name", object_bones->data()[cls_param->node_idx[0]].c_str()); + kv.write(s, "bone.0.name", bone_name_table->data()[cls_param->node_idx[0]].c_str()); kv.write(s, "bone.0.posx", cls_param->pos[0].x, flt_fmt); kv.write(s, "bone.0.posy", cls_param->pos[0].y, flt_fmt); kv.write(s, "bone.0.posz", cls_param->pos[0].z, flt_fmt); @@ -780,7 +780,7 @@ bool RobOsageTest::ctrl() { case SkinParam::CollisionTypeCapsule: case SkinParam::CollisionTypePlane: case SkinParam::CollisionTypeEllipse: - kv.write(s, "bone.1.name", object_bones->data()[cls_param->node_idx[1]].c_str()); + kv.write(s, "bone.1.name", bone_name_table->data()[cls_param->node_idx[1]].c_str()); kv.write(s, "bone.1.posx", cls_param->pos[1].x, flt_fmt); kv.write(s, "bone.1.posy", cls_param->pos[1].y, flt_fmt); kv.write(s, "bone.1.posz", cls_param->pos[1].z, flt_fmt); @@ -883,12 +883,12 @@ bool RobOsageTest::dest() { } void RobOsageTest::disp() { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - 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.flag.bit.rf_31) { + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); + if (rob_chr && !pv_osage_manager_array_get_disp(rob_id) + && rob_chr->get_disp_flag() && !rob_chr->rob_base.flag.bit.no_ctrl) { disp_coli(); disp_line(); } @@ -903,7 +903,7 @@ void RobOsageTest::basic() { rob_osage_test_dw->UpdateLayout(); } - rob_chara_item_equip_object* skin_disp = get_skin_disp(); + RobSkinDisp* skin_disp = get_skin_work(); if (!skin_disp) return; @@ -938,7 +938,7 @@ void RobOsageTest::disp_coli() { if (!coli) return; - rob_chara_item_equip_object* skin_disp = get_skin_disp(); + RobSkinDisp* skin_disp = get_skin_work(); if (!skin_disp || skin_disp->obj_uid != obj_info) return; @@ -1143,7 +1143,7 @@ void RobOsageTest::disp_line() { if (!line) return; - rob_chara_item_equip_object* skin_disp = get_skin_disp(); + RobSkinDisp* skin_disp = get_skin_work(); if (!skin_disp || skin_disp->obj_uid != obj_info) return; @@ -1257,7 +1257,7 @@ void RobOsageTest::disp_line_cls_param(const mat4& motion_matrix, const vec3& po SCREEN_MODE_MAX, spr::SPR_PRIO_DW, color_yellow); } -inline ExClothBlock* RobOsageTest::get_cloth_block(rob_chara_item_equip_object* skin_disp) const { +inline ExClothBlock* RobOsageTest::get_cloth_block(RobSkinDisp* skin_disp) const { if (skin_disp && skin_disp->obj_uid == obj_info && osage_index >= skin_disp->osage_blk.size() && osage_index - skin_disp->osage_blk.size() < skin_disp->cloth.size()) return skin_disp->cloth[osage_index - skin_disp->osage_blk.size()]; @@ -1282,17 +1282,17 @@ inline SkinParam::CollisionParam* RobOsageTest::get_cls_param( return 0; } -inline rob_chara_item_equip_object* RobOsageTest::get_skin_disp() const { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +inline RobSkinDisp* RobOsageTest::get_skin_work() const { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return 0; - rob_chara_item_equip* rob_disp = rob_chara_array_get_rob_disp(chara_id); + RobDisp* rob_disp = get_rob_management()->get_rob_robdisp_work((ROB_ID)rob_id); if (rob_disp && rpk >= 0 && rpk < RPK_MAX) - return rob_disp->get_skin_disp(rpk); + return rob_disp->get_skin_work(rpk); return 0; } -inline ExNodeBlock* RobOsageTest::get_node_block(rob_chara_item_equip_object* skin_disp) const { +inline ExNodeBlock* RobOsageTest::get_node_block(RobSkinDisp* skin_disp) const { if (skin_disp && skin_disp->obj_uid == obj_info) if (osage_index < skin_disp->osage_blk.size()) return skin_disp->osage_blk[osage_index]; @@ -1302,7 +1302,7 @@ inline ExNodeBlock* RobOsageTest::get_node_block(rob_chara_item_equip_object* sk return 0; } -inline ExOsageBlock* RobOsageTest::get_osage_block(rob_chara_item_equip_object* skin_disp) const { +inline ExOsageBlock* RobOsageTest::get_osage_block(RobSkinDisp* skin_disp) const { if (skin_disp && skin_disp->obj_uid == obj_info && osage_index < skin_disp->osage_blk.size()) return skin_disp->osage_blk[osage_index]; return 0; @@ -1385,14 +1385,14 @@ void RobOsageTestDw::Rob::Init(dw::Composite* parent) { void RobOsageTestDw::Rob::CharaCallback(dw::Widget* data) { dw::ListBox* list_box = dynamic_cast(data); if (list_box) - rob_osage_test->load_chara_id = (int32_t)list_box->list->selected_item; + rob_osage_test->rob_id_load = (ROB_ID)(int32_t)list_box->list->selected_item; } void RobOsageTestDw::Rob::DefaultCallback(dw::Widget* data) { dw::Button* button = dynamic_cast(data); if (button) { - rob_osage_test->chara_id = -1; - rob_osage_test->load_chara_id = 0; + rob_osage_test->rob_id = ROB_ID_NULL; + rob_osage_test->rob_id_load = ROB_ID_1P; rob_osage_test->rpk = RPK_NONE; rob_osage_test->obj_info = object_info(); rob_osage_test->osage_index = -1; @@ -1427,7 +1427,7 @@ void RobOsageTestDw::Rob::ObjectCallback(dw::Widget* data) { rob_osage_test_dw->root.list_box->ClearItems(); - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); if (skin_disp) { for (ExOsageBlock*& i : skin_disp->osage_blk) rob_osage_test_dw->root.list_box->AddItem(i->name); @@ -2222,7 +2222,7 @@ void RobOsageTestDw::Node::CollisionRadius::Update(bool value) { void RobOsageTestDw::Node::CollisionRadius::Callback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue(); @@ -2321,7 +2321,7 @@ void RobOsageTestDw::Node::Hinge::Update(bool value) { void RobOsageTestDw::Node::Hinge::YMinCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue() * DEG_TO_RAD_FLOAT; @@ -2336,7 +2336,7 @@ void RobOsageTestDw::Node::Hinge::YMinCallback(dw::Widget* data) { void RobOsageTestDw::Node::Hinge::YMaxCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue() * DEG_TO_RAD_FLOAT; @@ -2351,7 +2351,7 @@ void RobOsageTestDw::Node::Hinge::YMaxCallback(dw::Widget* data) { void RobOsageTestDw::Node::Hinge::ZMinCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue() * DEG_TO_RAD_FLOAT; @@ -2366,7 +2366,7 @@ void RobOsageTestDw::Node::Hinge::ZMinCallback(dw::Widget* data) { void RobOsageTestDw::Node::Hinge::ZMaxCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue() * DEG_TO_RAD_FLOAT; @@ -2425,7 +2425,7 @@ void RobOsageTestDw::Node::InertialCancel::Update(bool value) { void RobOsageTestDw::Node::InertialCancel::Callback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue(); @@ -2484,7 +2484,7 @@ void RobOsageTestDw::Node::Weight::Update(bool value) { void RobOsageTestDw::Node::Weight::Callback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - rob_chara_item_equip_object* skin_disp = rob_osage_test->get_skin_disp(); + RobSkinDisp* skin_disp = rob_osage_test->get_skin_work(); ExOsageBlock* osg = rob_osage_test->get_osage_block(skin_disp); if (osg) { float_t value = slider->GetValue(); @@ -2569,7 +2569,7 @@ void RobOsageTestDw::Collision::Update() { data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; - const std::vector* object_bones = aft_bone_data->get_bone_name(BONE_KIND_CMN); + const std::vector* bone_name_table = aft_bone_data->get_bone_name_table(BONE_KIND_CMN); char buf[0x200]; int32_t index = 0; @@ -2585,7 +2585,7 @@ void RobOsageTestDw::Collision::Update() { case SkinParam::CollisionTypeEllipse: case SkinParam::CollisionTypeAABB: sprintf_s(buf, sizeof(buf), "%d %s/%s", index, - collision_type_name_list[i.type], object_bones->data()[i.node_idx[0]].c_str()); + collision_type_name_list[i.type], bone_name_table->data()[i.node_idx[0]].c_str()); break; default: sprintf_s(buf, sizeof(buf), "%d", index); @@ -2690,11 +2690,11 @@ void RobOsageTestDw::ColliElement::Init(dw::Composite* parent) { data_struct* aft_data = &data_list[DATA_AFT]; bone_database* aft_bone_data = &aft_data->data_ft.bone_data; - const std::vector* object_bones = aft_bone_data->get_bone_name(BONE_KIND_CMN); + const std::vector* bone_name_table = aft_bone_data->get_bone_name_table(BONE_KIND_CMN); bone0_list_box = new dw::ListBox(group); bone0_list_box->SetMaxItems(20); - for (const std::string& i : *object_bones) + for (const std::string& i : *bone_name_table) bone0_list_box->AddItem(i); bone0_list_box->callback_data.i32 = 0; bone0_list_box->AddSelectionListener(new dw::SelectionListenerOnHook( @@ -2726,7 +2726,7 @@ void RobOsageTestDw::ColliElement::Init(dw::Composite* parent) { bone1_list_box = new dw::ListBox(group); bone1_list_box->SetMaxItems(20); - for (const std::string& i : *object_bones) + for (const std::string& i : *bone_name_table) bone1_list_box->AddItem(i); bone1_list_box->callback_data.i32 = 1; bone1_list_box->AddSelectionListener(new dw::SelectionListenerOnHook( diff --git a/src/ReDIVA/data_test/rob_osage_test.hpp b/src/ReDIVA/data_test/rob_osage_test.hpp index 993d471b..c2847b99 100644 --- a/src/ReDIVA/data_test/rob_osage_test.hpp +++ b/src/ReDIVA/data_test/rob_osage_test.hpp @@ -70,8 +70,8 @@ public: bool coli; bool line; - int32_t chara_id; - int32_t load_chara_id; + ROB_ID rob_id; + ROB_ID rob_id_load; CHARA_NUM chara_num; int32_t cos_id; ROB_PARTS_KIND rpk; @@ -107,17 +107,17 @@ public: void disp_line(); void disp_line_cls_param(const mat4& transform, const vec3& pos); - ExClothBlock* get_cloth_block(rob_chara_item_equip_object* skin_disp) const; + ExClothBlock* get_cloth_block(RobSkinDisp* skin_disp) const; std::vector* get_cls_list(ExNodeBlock* cls) const; SkinParam::CollisionParam* get_cls_param(std::vector* cls_list) const; - rob_chara_item_equip_object* get_skin_disp() const; - ExNodeBlock* get_node_block(rob_chara_item_equip_object* skin_disp) const; - ExOsageBlock* get_osage_block(rob_chara_item_equip_object* skin_disp) const; + RobSkinDisp* get_skin_work() const; + ExNodeBlock* get_node_block(RobSkinDisp* skin_disp) const; + ExOsageBlock* get_osage_block(RobSkinDisp* skin_disp) const; void set_node(skin_param_osage_node* skp_osg_node); void set_root(skin_param* skp); inline std::vector* get_cls_list() const { - rob_chara_item_equip_object* skin_disp = get_skin_disp(); + RobSkinDisp* skin_disp = get_skin_work(); if (!skin_disp) return 0; @@ -129,7 +129,7 @@ public: } inline skin_param* get_skin_param() const { - rob_chara_item_equip_object* skin_disp = get_skin_disp(); + RobSkinDisp* skin_disp = get_skin_work(); ExNodeBlock* ex_node = get_node_block(skin_disp); if (!ex_node) return 0; @@ -142,7 +142,7 @@ public: } inline skin_param_osage_node* get_skin_param_osage_node() const { - rob_chara_item_equip_object* skin_disp = get_skin_disp(); + RobSkinDisp* skin_disp = get_skin_work(); ExOsageBlock* osg = get_osage_block(skin_disp); if (osg && osg->osage_work.joint_node_vec.size() > 1) return &osg->osage_work.joint_node_vec.data()[1].data_ptr->skp_osg_node; diff --git a/src/ReDIVA/data_view/auth_3d.cpp b/src/ReDIVA/data_view/auth_3d.cpp index 2d855600..c680ecbf 100644 --- a/src/ReDIVA/data_view/auth_3d.cpp +++ b/src/ReDIVA/data_view/auth_3d.cpp @@ -5,6 +5,7 @@ #include "auth_3d.hpp" #include "../../KKdLib/database/item_table.hpp" +#include "../../CRE/rob/rob.hpp" #include "../../CRE/auth_3d.hpp" #include "../imgui_helper.hpp" #include "../task_window.hpp" @@ -155,8 +156,8 @@ void DataViewAuth3D::window() { tree_node_flags = tree_node_base_flags; tree_node_flags |= ImGuiTreeNodeFlags_DefaultOpen; - if (auth->chara_id != -1) - ImGui::Text("Chara: %d", auth->chara_id); + if (auth->rob_id != ROB_ID_NULL) + ImGui::Text("Chara: %d", auth->rob_id + 1); else ImGui::Text("Chara: None"); diff --git a/src/ReDIVA/graphics/color_change.cpp b/src/ReDIVA/graphics/color_change.cpp index 0d0b6008..a2daca45 100644 --- a/src/ReDIVA/graphics/color_change.cpp +++ b/src/ReDIVA/graphics/color_change.cpp @@ -49,8 +49,8 @@ public: bool set; int32_t color_change_index; std::vector textures; - std::vector color_tones; - color_tone color_tone_temp; + std::vector color_tones; + ImgfColorToneParam color_tone_temp; bool show; bool auto_resize; CHARA_NUM chara_num; @@ -65,11 +65,11 @@ public: virtual void Hide() override; texture* GetChgTex(); - color_tone* GetColorTone(); - void GetColorToneDefault(color_tone& value); - const item_table_item* GetItem(int32_t item_index); + ImgfColorToneParam* GetColorTone(); + void GetColorToneDefault(ImgfColorToneParam& value); + const RobItemTable* GetItem(int32_t item_index); void GetItemColTone(); - const item_table_item_data* GetItemData(int32_t item_index); + const RobItemData* GetItemData(int32_t item_index); int32_t GetItemNo(int32_t item_index); const char* GetItemTexChangeName(); texture* GetOrgTex(); @@ -136,7 +136,7 @@ ColorChangeDw::ColorChangeDw() { obj_set_id = aft_obj_db->get_object_set_id(0u); color_change_index = 0; - color_tone col_tone; + ImgfColorToneParam col_tone; GetColorToneDefault(col_tone); color_tone_temp = col_tone; @@ -259,7 +259,7 @@ ColorChangeDw::ColorChangeDw() { blend_r = dw::Slider::Create(color_group, (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "BLEND R"); - blend_r->SetParams(col_tone.blend.x, 0.0f, 5.0f, 0.4f, 0.01f, 0.1f); + blend_r->SetParams(col_tone.blend_color.x, 0.0f, 5.0f, 0.4f, 0.01f, 0.1f); blend_r->format = "%4.2f"; blend_r->AddSelectionListener(new dw::SelectionListenerOnHook( (dw::SelectionListenerOnHook::CallbackFunc)ColorChangeDw::BlendRCallback)); @@ -267,7 +267,7 @@ ColorChangeDw::ColorChangeDw() { blend_g = dw::Slider::Create(color_group, (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "BLEND G"); - blend_g->SetParams(col_tone.blend.y, 0.0f, 5.0f, 0.4f, 0.01f, 0.1f); + blend_g->SetParams(col_tone.blend_color.y, 0.0f, 5.0f, 0.4f, 0.01f, 0.1f); blend_g->format = "%4.2f"; blend_g->AddSelectionListener(new dw::SelectionListenerOnHook( (dw::SelectionListenerOnHook::CallbackFunc)ColorChangeDw::BlendGCallback)); @@ -275,7 +275,7 @@ ColorChangeDw::ColorChangeDw() { blend_b = dw::Slider::Create(color_group, (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "BLEND B"); - blend_b->SetParams(col_tone.blend.z, 0.0f, 5.0f, 0.4f, 0.01f, 0.1f); + blend_b->SetParams(col_tone.blend_color.z, 0.0f, 5.0f, 0.4f, 0.01f, 0.1f); blend_b->format = "%4.2f"; blend_b->AddSelectionListener(new dw::SelectionListenerOnHook( (dw::SelectionListenerOnHook::CallbackFunc)ColorChangeDw::BlendBCallback)); @@ -283,7 +283,7 @@ ColorChangeDw::ColorChangeDw() { offset_r = dw::Slider::Create(color_group, (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "OFFSET R"); - offset_r->SetParams(col_tone.offset.x, -1.0f, 1.0f, 0.4f, 0.01f, 0.1f); + offset_r->SetParams(col_tone.offset_color.x, -1.0f, 1.0f, 0.4f, 0.01f, 0.1f); offset_r->format = "%4.2f"; offset_r->AddSelectionListener(new dw::SelectionListenerOnHook( (dw::SelectionListenerOnHook::CallbackFunc)ColorChangeDw::OffsetRCallback)); @@ -291,7 +291,7 @@ ColorChangeDw::ColorChangeDw() { offset_g = dw::Slider::Create(color_group, (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "OFFSET G"); - offset_g->SetParams(col_tone.offset.y, -1.0f, 1.0f, 0.4f, 0.01f, 0.1f); + offset_g->SetParams(col_tone.offset_color.y, -1.0f, 1.0f, 0.4f, 0.01f, 0.1f); offset_g->format = "%4.2f"; offset_g->AddSelectionListener(new dw::SelectionListenerOnHook( (dw::SelectionListenerOnHook::CallbackFunc)ColorChangeDw::OffsetGCallback)); @@ -299,7 +299,7 @@ ColorChangeDw::ColorChangeDw() { offset_b = dw::Slider::Create(color_group, (dw::Flags)(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_height, "OFFSET B"); - offset_b->SetParams(col_tone.offset.z, -1.0f, 1.0f, 0.4f, 0.01f, 0.1f); + offset_b->SetParams(col_tone.offset_color.z, -1.0f, 1.0f, 0.4f, 0.01f, 0.1f); offset_b->format = "%4.2f"; offset_b->AddSelectionListener(new dw::SelectionListenerOnHook( (dw::SelectionListenerOnHook::CallbackFunc)ColorChangeDw::OffsetBCallback)); @@ -371,7 +371,7 @@ void ColorChangeDw::Draw() { const texture* org_tex = GetOrgTex(); const texture* chg_tex = GetChgTex(); - const color_tone* col_tone = GetColorTone(); + const ImgfColorToneParam* col_tone = GetColorTone(); if (org_tex && chg_tex && col_tone) texture_apply_color_tone(org_tex, chg_tex, col_tone); @@ -419,34 +419,34 @@ texture* ColorChangeDw::GetChgTex() { return 0; } -color_tone* ColorChangeDw::GetColorTone() { +ImgfColorToneParam* ColorChangeDw::GetColorTone() { if (color_change_index < color_tones.size()) return &color_tones.data()[color_change_index]; return 0; } -void ColorChangeDw::GetColorToneDefault(color_tone& value) { - value = color_tone(); +void ColorChangeDw::GetColorToneDefault(ImgfColorToneParam& value) { + value = ImgfColorToneParam(); } -const item_table_item* ColorChangeDw::GetItem(int32_t item_index) { - int32_t item_no = GetItemNo(item_index); +const RobItemTable* ColorChangeDw::GetItem(int32_t item_index) { + uint32_t item_no = GetItemNo(item_index); if (item_no != -1) - return item_table_handler_array_get_item(chara_num, item_no); + return get_rob_item_table(chara_num, item_no); return 0; } void ColorChangeDw::GetItemColTone() { - color_tone* col_tone = GetColorTone(); + ImgfColorToneParam* col_tone = GetColorTone(); if (col_tone) { - const item_table_item* item = GetItem(item_index); + const RobItemTable* item = GetItem(item_index); if (item && item_texture_index < item->data.col.size()) - *col_tone = item->data.col.data()[item_texture_index].col_tone; + *col_tone = item->data.col.data()[item_texture_index].color; } } -const item_table_item_data* ColorChangeDw::GetItemData(int32_t item_index) { - const item_table_item* item = GetItem(item_index); +const RobItemData* ColorChangeDw::GetItemData(int32_t item_index) { + const RobItemTable* item = GetItem(item_index); if (item) return &item->data; return 0; @@ -454,10 +454,10 @@ const item_table_item_data* ColorChangeDw::GetItemData(int32_t item_index) { int32_t ColorChangeDw::GetItemNo(int32_t item_index) { int32_t index = 0; - const item_table* item = item_table_handler_array_get_table(chara_num); - if (item) - for (auto& i : item->item) - if (i.second.attr & 0x68) { + const RobItemHeader* tbl = get_rob_item_header(chara_num); + if (tbl) + for (auto& i : tbl->table) + if (i.second.attr & (ROB_ITEM_ATTR_HADA | ROB_ITEM_ATTR_NUDE | ROB_ITEM_ATTR_COL)) { if (item_index == index) return 0; index++; @@ -470,11 +470,11 @@ const char* ColorChangeDw::GetItemTexChangeName() { texture_database* aft_tex_db = &aft_data->data_ft.tex_db; std::string item = item_texture_names->GetItemStr(item_texture_index); - const item_table_item_data* itm_data = GetItemData(item_index); + const RobItemData* itm_data = GetItemData(item_index); if (itm_data) - for (const item_table_item_data_tex& i : itm_data->tex) - if (!item.compare(aft_tex_db->get_texture_name(i.org))) - return aft_tex_db->get_texture_name(i.chg); + for (const RobItemDataTex& i : itm_data->tex) + if (!item.compare(aft_tex_db->get_texture_name(i.org_uid))) + return aft_tex_db->get_texture_name(i.chg_uid); return 0; } @@ -486,15 +486,15 @@ texture* ColorChangeDw::GetOrgTex() { } void ColorChangeDw::GetSetColorTone() { - color_tone* col_tone = GetColorTone(); + ImgfColorToneParam* col_tone = GetColorTone(); if (col_tone) { inverse->SetValue(col_tone->inverse); - blend_r->SetValue(col_tone->blend.x); - blend_g->SetValue(col_tone->blend.y); - blend_b->SetValue(col_tone->blend.z); - offset_r->SetValue(col_tone->offset.x); - offset_g->SetValue(col_tone->offset.y); - offset_b->SetValue(col_tone->offset.z); + blend_r->SetValue(col_tone->blend_color.x); + blend_g->SetValue(col_tone->blend_color.y); + blend_b->SetValue(col_tone->blend_color.z); + offset_r->SetValue(col_tone->offset_color.x); + offset_g->SetValue(col_tone->offset_color.y); + offset_b->SetValue(col_tone->offset_color.z); hue->SetValue(col_tone->hue); saturation->SetValue(col_tone->saturation); value->SetValue(col_tone->value); @@ -528,7 +528,7 @@ bool ColorChangeDw::LoadColorTone() { if (!textures.size()) return false; - color_tone col_tone; + ImgfColorToneParam col_tone; ColorChangeDw::GetColorToneDefault(col_tone); for (texture*& i : textures) color_tones.push_back(col_tone); @@ -634,12 +634,12 @@ void ColorChangeDw::UpdateItemTextureNames() { return; item_texture_names->ClearItems(); - const item_table_item_data* itm_data = GetItemData(item_index); + const RobItemData* itm_data = GetItemData(item_index); if (!itm_data) return; - for (const item_table_item_data_col& i : itm_data->col) { - const char* name = aft_tex_db->get_texture_name(i.tex_id); + for (const RobItemDataCol& i : itm_data->col) { + const char* name = aft_tex_db->get_texture_name(i.tex_uid); if (name) item_texture_names->AddItem(name); } @@ -681,49 +681,49 @@ void ColorChangeDw::AutoResizeCallback(dw::Button* data) { void ColorChangeDw::BlendBCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) - col_tone->blend.z = data->GetValue(); + col_tone->blend_color.z = data->GetValue(); } void ColorChangeDw::BlendGCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) - col_tone->blend.y = data->GetValue(); + col_tone->blend_color.y = data->GetValue(); } void ColorChangeDw::BlendRCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) - col_tone->blend.x = data->GetValue(); + col_tone->blend_color.x = data->GetValue(); } void ColorChangeDw::ContrastCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) col_tone->contrast = data->GetValue(); } void ColorChangeDw::CopyCallback(dw::Button* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) color_change_dw->color_tone_temp = *col_tone; } void ColorChangeDw::HueCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) col_tone->hue = data->GetValue(); } void ColorChangeDw::InverseCallback(dw::Button* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) col_tone->inverse = data->value; } @@ -736,7 +736,7 @@ void ColorChangeDw::ItemCallback(dw::ListBox* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; color_change_dw->item_index = index; - const item_table_item* item = color_change_dw->GetItem(index); + const RobItemTable* item = color_change_dw->GetItem(index); if (!item) { color_change_dw->UpdateItemTextureNames(); return; @@ -746,8 +746,8 @@ void ColorChangeDw::ItemCallback(dw::ListBox* data) { for (const uint32_t& i : item->objset) name = aft_obj_db->get_object_set_name(i); - if (item->attr & 0x40) - name = aft_obj_db->get_object_set_name(get_rob_data(color_change_dw->chara_num)->object_set); + if (item->attr & ROB_ITEM_ATTR_HADA) + name = aft_obj_db->get_object_set_name(get_rob_data(color_change_dw->chara_num)->objset); if (name) { color_change_dw->SetObjectSet(name); @@ -765,7 +765,7 @@ void ColorChangeDw::ItemTextureCallback(dw::ListBox* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; color_change_dw->item_texture_index = data->list->selected_item; - const item_table_item* item = color_change_dw->GetItem(color_change_dw->item_index); + const RobItemTable* item = color_change_dw->GetItem(color_change_dw->item_index); if (!item) return; @@ -773,7 +773,7 @@ void ColorChangeDw::ItemTextureCallback(dw::ListBox* data) { if (!size || color_change_dw->item_texture_index >= size) return; - if (item->attr & 0x04) { + if (item->attr & ROB_ITEM_ATTR_TEX) { const char* name = color_change_dw->GetItemTexChangeName(); if (name) color_change_dw->SetTextureName(name); @@ -803,23 +803,23 @@ void ColorChangeDw::ObjectSetCallback(dw::ListBox* data) { void ColorChangeDw::OffsetBCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) - col_tone->offset.z = data->GetValue(); + col_tone->offset_color.z = data->GetValue(); } void ColorChangeDw::OffsetGCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) - col_tone->offset.y = data->GetValue(); + col_tone->offset_color.y = data->GetValue(); } void ColorChangeDw::OffsetRCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) - col_tone->offset.x = data->GetValue(); + col_tone->offset_color.x = data->GetValue(); } void ColorChangeDw::OverwriteCallback(dw::Button* data) { @@ -828,21 +828,21 @@ void ColorChangeDw::OverwriteCallback(dw::Button* data) { void ColorChangeDw::PasteCallback(dw::Button* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) *col_tone = color_change_dw->color_tone_temp; } void ColorChangeDw::ResetCallback(dw::Button* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) color_change_dw->GetColorToneDefault(*col_tone); } void ColorChangeDw::SaturationCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) col_tone->saturation = data->GetValue(); } @@ -866,7 +866,7 @@ void ColorChangeDw::TextureCallback(dw::ListBox* data) { void ColorChangeDw::ValueCallback(dw::Slider* data) { ColorChangeDw* color_change_dw = (ColorChangeDw*)data->callback_data.v64; - color_tone* col_tone = color_change_dw->GetColorTone(); + ImgfColorToneParam* col_tone = color_change_dw->GetColorTone(); if (col_tone) col_tone->value = data->GetValue(); } diff --git a/src/ReDIVA/pv_game/pv_game.cpp b/src/ReDIVA/pv_game/pv_game.cpp index c44f3df3..8c06116d 100644 --- a/src/ReDIVA/pv_game/pv_game.cpp +++ b/src/ReDIVA/pv_game/pv_game.cpp @@ -118,7 +118,7 @@ struct pv_game_se_data { struct struc_674 { size_t performer; int32_t module; - rob_chara_pv_data_item item; + RobItemEquipInit item; bool field_1C; const pv_db_pv* pv; @@ -172,14 +172,14 @@ static void pv_game_time_pause(); static void pv_game_time_start(); static FrameRateControl* get_diva_pv_frame_rate(); -static SysFrameRate* sys_frame_rate_get(int32_t chara_id); +static SysFrameRate* sys_frame_rate_get(int32_t id); static int32_t sub_1400FCFD0(pv_game_chara* arr, const pv_db_pv* pv); static void sub_140105010(pv_game_chara* arr, size_t max_count, pv_game_item_mask* a3, struc_674& a4); static bool sub_1401279D0(); static bool sub_140128480(); -pv_game_chara::pv_game_chara() : chara_num(), cos(), chara_id(), pv_data(), rob_chr() { +pv_game_chara::pv_game_chara() : chara_num(), cos(), rob_id(), rob_chr() { } @@ -188,16 +188,16 @@ pv_game_chara::~pv_game_chara() { } bool pv_game_chara::check_chara() { - if (chara_id != -1) + if (rob_id != ROB_ID_NULL) return !!rob_chr; return false; } -void pv_game_chara::reset() { +void pv_game_chara::init() { chara_num = CN_MAX; cos = -1; - chara_id = -1; - pv_data.reset(); + rob_id = ROB_ID_NULL; + rob_init.init(); rob_chr = 0; motion_ids.clear(); motion_face_ids.clear(); @@ -385,12 +385,12 @@ void pv_game_data::reset() { for (pv_play_data& i : pv_data.playdata) { rob_chara* rob_chr = i.rob_chr; if (rob_chr) { - rob_chr->reset_data(&rob_chr->pv_data, aft_bone_data, aft_mot_db); - rob_chr->set_hand_l_mottbl_motion(0, 194, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->reset_rob(rob_chr->rob_init, aft_bone_data, aft_mot_db); + rob_chr->set_hand_l_mottbl_motion(0, MTP_HAND_NORMAL, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_hand_r_mottbl_motion(0, 194, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_r_mottbl_motion(0, MTP_HAND_NORMAL, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_visibility(true); + rob_chr->set_disp_flag(true); } i.motion_data.start_pos = 0.0f; @@ -1946,11 +1946,10 @@ void pv_game::edit_instrument_reset() { j.set_enable(false); } -void pv_game::edit_instrument_set_disp(int32_t chara_id, bool value) { - pv_game_edit_instrument& v4 = data.edit_instrument[chara_id]; - int32_t v5 = v4.index; - if (v5 >= 0 && v4.auth_3d_ids.size()) { - auth_3d_id& id = v4.auth_3d_ids[v5]; +void pv_game::edit_instrument_set_disp(int32_t rob_id, bool value) { + pv_game_edit_instrument& v4 = data.edit_instrument[rob_id]; + if (v4.index >= 0 && v4.auth_3d_ids.size()) { + auth_3d_id& id = v4.auth_3d_ids[v4.index]; if (id.check_not_empty()) id.set_visibility(value); } @@ -2172,9 +2171,9 @@ uint32_t pv_game::get_chreff_auth_3d_object_set(int32_t& uid) { return obj_set; } -int64_t pv_game::get_data_itmpv_time(int32_t chara_id, int32_t index) { - auto elem = data.itmpv[chara_id].find(index); - if (elem != data.itmpv[chara_id].end()) +int64_t pv_game::get_data_itmpv_time(int32_t rob_id, int32_t index) { + auto elem = data.itmpv[rob_id].find(index); + if (elem != data.itmpv[rob_id].end()) return elem->second.second; return -1; } @@ -2604,9 +2603,9 @@ bool pv_game::load() { for (int32_t i = 0; i < ROB_ID_MAX; i++) { pv_game_chara& j = data.chara[i]; - j.reset(); - j.pv_data.field_4 = false; - j.pv_data.field_70 = player_data->field_66C; + j.init(); + j.rob_init.disp = false; + j.rob_init.field_70 = player_data->field_66C; struc_674 v750; v750.performer = i; @@ -2618,25 +2617,25 @@ bool pv_game::load() { sub_140105010(data.chara, ROB_ID_MAX, items_mask, v750); if (data.height_adjust) - j.pv_data.height_adjust = true; + j.rob_init.height_adjust = true; pv_performer_size size = data.pv ? data.pv->get_performer_size(i) : PV_PERFORMER_NORMAL; switch (size) { case PV_PERFORMER_NORMAL: default: - j.pv_data.chara_size_index = 1; + j.rob_init.chara_size_index = 1; break; case PV_PERFORMER_PLAY_CHARA: - j.pv_data.chara_size_index = rob_data_get_chara_size_index(j.chara_num); + j.rob_init.chara_size_index = rob_data_get_chara_size_index(j.chara_num); break; case PV_PERFORMER_PV_CHARA: - j.pv_data.chara_size_index = rob_data_get_chara_size_index(data.pv->get_performer_chara(i)); + j.rob_init.chara_size_index = rob_data_get_chara_size_index(data.pv->get_performer_chara(i)); break; case PV_PERFORMER_SHORT: - j.pv_data.chara_size_index = 2; + j.rob_init.chara_size_index = 2; break; case PV_PERFORMER_TALL: - j.pv_data.chara_size_index = 0; + j.rob_init.chara_size_index = 0; break; } @@ -2673,90 +2672,80 @@ bool pv_game::load() { if (sub_14013C8C0()->sub_1400E7910() >= 4) { state = 12; - for (pv_game_chara& i : data.chara) { - if (!i.motion_ids.size()) - continue; - - i.chara_id = rob_chara_array_init_chara_num(i.chara_num, i.pv_data, i.cos, true); - if (i.chara_id != -1) - i.rob_chr = rob_chara_array_get(i.chara_id); - } - - if (data.pv->get_performer_count() < 2) - rctx_ptr->render.update_res(false, 1); - else - rctx_ptr->render.update_res(false, 2); - rctx_ptr->render_manager->set_effect_texture(0); - state = 12; - return false; } + else { + data.motion_set_ids.clear(); + data.motion_set_face_ids.clear(); - data.motion_set_ids.clear(); - data.motion_set_face_ids.clear(); + if (diff) { + for (int32_t i = 0; i < ROB_ID_MAX; i++) { + pv_game_chara& chr = data.chara[i]; + data.motion_set_ids.reserve(diff->motion[i].size()); + data.motion_set_face_ids.reserve(diff->motion[i].size()); - if (diff) { - for (int32_t i = 0; i < ROB_ID_MAX; i++) { - pv_game_chara& chr = data.chara[i]; - data.motion_set_ids.reserve(diff->motion[i].size()); - data.motion_set_face_ids.reserve(diff->motion[i].size()); + int32_t face_mot_index = 0; + for (const pv_db_pv_motion& j : diff->motion[i]) { + if (j.index < 0) + continue; - int32_t motion_face_id_index = 0; - for (const pv_db_pv_motion& j : diff->motion[i]) { - if (j.index < 0) - continue; + uint32_t motnum = j.id; + if (data.pv) + motnum = data.pv->get_chrmot_motion_id(i, chr.chara_num, j); - uint32_t motion_id = j.id; - if (data.pv) - motion_id = data.pv->get_chrmot_motion_id(i, chr.chara_num, j); + uint32_t motion_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motnum); + if (motion_set_id != -1) { + if (!prj::find(chr.motion_ids, motnum)) + chr.motion_ids.push_back(motnum); + if (!prj::find(data.motion_set_ids, motion_set_id)) + data.motion_set_ids.push_back(motion_set_id); + } - uint32_t motion_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motion_id); - if (motion_set_id != -1) { - if (!prj::find(chr.motion_ids, motion_id)) - chr.motion_ids.push_back(motion_id); - if (!prj::find(data.motion_set_ids, motion_set_id)) - data.motion_set_ids.push_back(motion_set_id); - } + if (j.index <= 0) + continue; - if (j.index <= 0) - continue; + std::string motion_face_name; + motion_face_name.assign(get_chara_name_face_mot(chr.chara_num)); + motion_face_name.append("_FACE_"); + motion_face_name.append(j.name); - std::string motion_face_name; - motion_face_name.assign(get_chara_name_face_mot(chr.chara_num)); - motion_face_name.append("_FACE_"); - motion_face_name.append(j.name); + uint32_t motion_face_id = aft_mot_db->get_motion_id(motion_face_name.c_str()); + if (face_mot_index < 10) + chr.rob_init.face_mot_slot[face_mot_index++] = motion_face_id; - uint32_t motion_face_id = aft_mot_db->get_motion_id(motion_face_name.c_str()); - if (motion_face_id_index < 10) - chr.pv_data.motion_face_ids[motion_face_id_index++] = motion_face_id; - - uint32_t motion_face_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motion_face_id); - if (motion_face_set_id != -1 && motion_face_set_id != 2) { - if (!prj::find(chr.motion_face_ids, motion_face_id)) - chr.motion_face_ids.push_back(motion_face_id); - if (!prj::find(data.motion_set_face_ids, motion_face_set_id)) - data.motion_set_face_ids.push_back(motion_face_set_id); + uint32_t motion_face_set_id = aft_mot_db->get_motion_set_id_by_motion_id(motion_face_id); + if (motion_face_set_id != -1 && motion_face_set_id != 2) { + if (!prj::find(chr.motion_face_ids, motion_face_id)) + chr.motion_face_ids.push_back(motion_face_id); + if (!prj::find(data.motion_set_face_ids, motion_face_set_id)) + data.motion_set_face_ids.push_back(motion_face_set_id); + } } } } + + for (uint32_t& i : data.motion_set_ids) { + motion_set_load_motion(i, std::string(data.pv->mdata.dir), aft_mot_db); + motion_set_load_mothead(i, std::string(data.pv->mdata.dir), aft_mot_db); + } + + for (uint32_t& i : data.motion_set_face_ids) + motion_set_load_motion(i, std::string(data.pv->mdata.dir), aft_mot_db); + + if (data.pv->pv_expression_file_name.size()) + pv_expression_file_load(aft_data, data.pv->pv_expression_file_name.c_str()); + state = 3; } - for (uint32_t& i : data.motion_set_ids) { - motion_set_load_motion(i, std::string(data.pv->mdata.dir), aft_mot_db); - motion_set_load_mothead(i, std::string(data.pv->mdata.dir), aft_mot_db); - } - - for (uint32_t& i : data.motion_set_face_ids) - motion_set_load_motion(i, std::string(data.pv->mdata.dir), aft_mot_db); - - pv_expression_file_load(aft_data, data.pv->pv_expression_file_name.c_str()); - for (pv_game_chara& i : data.chara) { if (!i.motion_ids.size()) continue; - i.chara_id = rob_chara_array_init_chara_num(i.chara_num, i.pv_data, i.cos, true); - if (i.chara_id != -1) - i.rob_chr = rob_chara_array_get(i.chara_id); + RobManagement* rob_man = get_rob_management(); + if (rob_man) { + i.rob_id = rob_man->create_rob(i.chara_num, i.rob_init, i.cos, true); + if (i.rob_id != ROB_ID_NULL) + i.rob_chr = rob_man->get_rob(i.rob_id); + } } if (data.pv->get_performer_count() < 2) @@ -2764,7 +2753,6 @@ bool pv_game::load() { else rctx_ptr->render.update_res(false, 2); rctx_ptr->render_manager->set_effect_texture(0); - state = 3; } return false; case 3: { const pv_db_pv_difficulty* diff = get_pv_db_pv()->get_difficulty( @@ -2886,9 +2874,9 @@ bool pv_game::load() { bool has_chara = false; for (pv_game_chara& i : data.chara) - if (i.chara_id != -1 && i.rob_chr) { + if (i.rob_id != ROB_ID_NULL && i.rob_chr) { has_chara = true; - if (!task_rob_manager_check_chara_loaded(i.rob_chr->chara_id)) + if (!task_rob_manager_check_chara_loaded(i.rob_id)) return false; } @@ -2897,13 +2885,13 @@ bool pv_game::load() { for (int32_t i = 0; i < ROB_ID_MAX; i++) { pv_game_chara& chr = data.chara[i]; - if (chr.chara_id == -1 || !chr.rob_chr) + if (chr.rob_id == ROB_ID_NULL || !chr.rob_chr) continue; for (int32_t j = 0; j < PV_PERFORMER_ITEM_MAX; j++) { - int32_t item_no = data.pv->get_performer_item(i, (pv_performer_item)j); + uint32_t item_no = data.pv->get_performer_item(i, (pv_performer_item)j); if (!item_no || item_no < 0 && !items_mask[i].arr[j]) - chr.rob_chr->load_body_parts_object_info( + chr.rob_chr->set_item( pv_performer_item_to_rob_parts_kind((pv_performer_item)j), {}, aft_bone_data, aft_data, aft_obj_db); } @@ -2918,14 +2906,14 @@ bool pv_game::load() { if (!data.use_osage_play_data) for (pv_game_chara& i : data.chara) { - if (i.chara_id == -1 || !i.rob_chr) + if (i.rob_id == ROB_ID_NULL || !i.rob_chr) continue; - pv_osage_manager_array_reset(i.chara_id); - const std::vector* set_motion = data.pv_data.get_set_motion(i.chara_id); + pv_osage_manager_array_reset(i.rob_id); + const std::vector* set_motion = data.pv_data.get_set_motion(i.rob_id); if (set_motion) - pv_osage_manager_array_set_pv_set_motion(i.chara_id, *set_motion); - pv_osage_manager_array_set_pv_id(i.chara_id, data.pv->id, true); + pv_osage_manager_array_set_pv_set_motion(i.rob_id, *set_motion); + pv_osage_manager_array_set_pv_id(i.rob_id, data.pv->id, true); } state = 8; } return false; @@ -3603,7 +3591,7 @@ bool pv_game::load() { data.play_data.ogg = true; for (pv_game_chara& i : data.chara) - if (i.check_chara() && !task_rob_manager_check_chara_loaded(i.chara_id)) + if (i.check_chara() && !task_rob_manager_check_chara_loaded(i.rob_id)) return false; pv_game_music_get()->ogg_reset(); @@ -3680,9 +3668,9 @@ bool pv_game::load() { for (pv_game_chara& i : data.chara) if (i.check_chara()) { - i.rob_chr->set_hand_l_mottbl_motion(0, 194, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + i.rob_chr->set_hand_l_mottbl_motion(0, MTP_HAND_NORMAL, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - i.rob_chr->set_hand_r_mottbl_motion(0, 194, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + i.rob_chr->set_hand_r_mottbl_motion(0, MTP_HAND_NORMAL, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); } @@ -3774,7 +3762,7 @@ bool pv_game::load() { for (pv_game_chara& i : data.chara) if (i.check_chara()) - i.rob_chr->set_visibility(true); + i.rob_chr->set_disp_flag(true); field_4 = false; if (sub_14013C8C0()->sub_1400E7910() == 3) @@ -3884,14 +3872,14 @@ bool pv_game::load() { continue; rob_chara* rob_chr = i.rob_chr; - rob_chr->set_visibility(true); + rob_chr->set_disp_flag(true); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } - rob_chr->set_hand_l_mottbl_motion(0, 194, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_l_mottbl_motion(0, MTP_HAND_NORMAL, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_hand_r_mottbl_motion(0, 194, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_r_mottbl_motion(0, MTP_HAND_NORMAL, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); } @@ -4050,15 +4038,8 @@ void pv_game::reset() { data.field_2CFB0 = 0; data.chance_point = 0; - for (pv_game_chara& i : data.chara) { - i.chara_num = CN_MAX; - i.cos = -1; - i.chara_id = -1; - i.pv_data = {}; - i.rob_chr = 0; - i.motion_ids.clear(); - i.motion_face_ids.clear(); - } + for (pv_game_chara& i : data.chara) + i.init(); data.motion_set_ids.clear(); data.motion_set_face_ids.clear(); @@ -4388,7 +4369,7 @@ void pv_game::set_chara_use_opd(bool value) { return; for (pv_game_chara& i : data.chara) - if (i.chara_id != -1 && i.rob_chr) + if (i.rob_id != ROB_ID_NULL && i.rob_chr) i.rob_chr->set_use_opd(value); } @@ -4414,9 +4395,9 @@ void pv_game::set_data_campv(int32_t type, int32_t index, float_t frame) { } } -void pv_game::set_data_itmpv(int32_t chara_id, int32_t index, bool enable, int64_t time) { - auto elem = data.itmpv[chara_id].find(index); - if (elem == data.itmpv[chara_id].end()) +void pv_game::set_data_itmpv(int32_t rob_id, int32_t index, bool enable, int64_t time) { + auto elem = data.itmpv[rob_id].find(index); + if (elem == data.itmpv[rob_id].end()) return; auth_3d_id& id = elem->second.first; @@ -4432,45 +4413,45 @@ void pv_game::set_data_itmpv(int32_t chara_id, int32_t index, bool enable, int64 } } -void pv_game::set_data_itmpv_chara_id(int32_t chara_id, int32_t index, bool attach) { - auto elem = data.itmpv[chara_id].find(index); - if (elem != data.itmpv[chara_id].end()) - elem->second.first.set_chara_id(attach ? chara_id : -1); +void pv_game::set_data_itmpv_chara_id(int32_t rob_id, int32_t index, bool attach) { + auto elem = data.itmpv[rob_id].find(index); + if (elem != data.itmpv[rob_id].end()) + elem->second.first.set_chara_id(attach ? rob_id : ROB_ID_NULL); } -void pv_game::set_data_itmpv_req_frame(int32_t chara_id, int32_t index, float_t value) { - auto elem = data.itmpv[chara_id].find(index); - if (elem != data.itmpv[chara_id].end()) +void pv_game::set_data_itmpv_req_frame(int32_t rob_id, int32_t index, float_t value) { + auto elem = data.itmpv[rob_id].find(index); + if (elem != data.itmpv[rob_id].end()) elem->second.first.set_req_frame(value); } -void pv_game::set_data_itmpv_max_frame(int32_t chara_id, float_t value) { - for (auto& i : data.itmpv[chara_id]) +void pv_game::set_data_itmpv_max_frame(int32_t rob_id, float_t value) { + for (auto& i : data.itmpv[rob_id]) i.second.first.set_max_frame(value); } -void pv_game::set_data_itmpv_max_frame(int32_t chara_id, int32_t index, float_t value) { - auto elem = data.itmpv[chara_id].find(index); - if (elem != data.itmpv[chara_id].end()) +void pv_game::set_data_itmpv_max_frame(int32_t rob_id, int32_t index, float_t value) { + auto elem = data.itmpv[rob_id].find(index); + if (elem != data.itmpv[rob_id].end()) elem->second.first.set_max_frame(value); } -void pv_game::set_data_itmpv_visibility(int32_t chara_id, bool value) { - for (auto& i : data.itmpv[chara_id]) +void pv_game::set_data_itmpv_visibility(int32_t rob_id, bool value) { + for (auto& i : data.itmpv[rob_id]) i.second.first.set_visibility(value); } -void pv_game::set_data_itmpv_visibility(int32_t chara_id, int32_t index, bool value) { - auto elem = data.itmpv[chara_id].find(index); - if (elem != data.itmpv[chara_id].end()) +void pv_game::set_data_itmpv_visibility(int32_t rob_id, int32_t index, bool value) { + auto elem = data.itmpv[rob_id].find(index); + if (elem != data.itmpv[rob_id].end()) elem->second.first.set_visibility(value); } -void pv_game::set_edit_instrument(int32_t chara_id, bool disp, int32_t index, float_t frame, float_t frame_speed) { - if (chara_id < 0 || chara_id >= 3) +void pv_game::set_edit_instrument(int32_t rob_id, bool disp, int32_t index, float_t frame, float_t frame_speed) { + if (rob_id < ROB_ID_1P || rob_id > ROB_ID_3P) return; - pv_game_edit_instrument& edit_instrument = data.edit_instrument[chara_id]; + pv_game_edit_instrument& edit_instrument = data.edit_instrument[rob_id]; if (edit_instrument.index >= 0) { if (edit_instrument.index >= edit_instrument.auth_3d_ids.size()) return; @@ -4489,10 +4470,10 @@ void pv_game::set_edit_instrument(int32_t chara_id, bool disp, int32_t index, fl id.set_visibility(disp); id.set_paused(false); id.set_req_frame(frame); - id.set_chara_id(chara_id); + id.set_chara_id(rob_id); id.set_last_frame(id.get_play_control_size() - 1.0f); - FrameRateControl* sys_frame_rate = sys_frame_rate_get(chara_id); + FrameRateControl* sys_frame_rate = sys_frame_rate_get(rob_id); sys_frame_rate->set_frame_speed(frame_speed); id.set_frame_rate(sys_frame_rate); } @@ -4501,18 +4482,18 @@ void pv_game::set_edit_instrument(int32_t chara_id, bool disp, int32_t index, fl } void pv_game::set_eyes_adjust(pv_game_chara* chr) { - chr->pv_data.eyes_adjust.xrot_adjust = data.pv->eyes_xrot_adjust; + chr->rob_init.eyes_adjust.xrot_adjust = data.pv->eyes_xrot_adjust; if (data.pv->eyes_base_adjust_type != EYES_BASE_ADJUST_NONE) - chr->pv_data.eyes_adjust.base_adjust = data.pv->eyes_base_adjust_type; + chr->rob_init.eyes_adjust.base_adjust = data.pv->eyes_base_adjust_type; auto elem = data.pv->eyes_rot_rate.find(chr->chara_num); if (elem != data.pv->eyes_rot_rate.end()) { - chr->pv_data.eyes_adjust.neg = elem->second.xn_rate; - chr->pv_data.eyes_adjust.pos = elem->second.xp_rate; + chr->rob_init.eyes_adjust.neg = elem->second.xn_rate; + chr->rob_init.eyes_adjust.pos = elem->second.xp_rate; } } -void pv_game::set_item(size_t performer, rob_chara_pv_data_item& value) { +void pv_game::set_item(size_t performer, RobItemEquipInit& value) { items[performer] = value; } @@ -4558,37 +4539,37 @@ void pv_game::set_osage_init(const pv_game_chara& chr) { osage_init_data osage_init; osage_init.rob_chr = chr.rob_chr; osage_init.pv_id = pv->id; - osage_init.motion_id = i; + osage_init.motnum = i; osage_init.frame = -1; vec.push_back(osage_init); } - const std::vector* set_motion = data.pv_data.get_set_motion(chr.chara_id); + const std::vector* set_motion = data.pv_data.get_set_motion(chr.rob_id); if (set_motion) for (const pv_data_set_motion& i : *set_motion) { osage_init_data osage_init; osage_init.rob_chr = chr.rob_chr; osage_init.pv_id = pv->id; - osage_init.motion_id = i.motion_id; + osage_init.motnum = i.motnum; osage_init.frame = (int32_t)prj::roundf(i.frame_stage_index.first); vec.push_back(osage_init); } for (const pv_db_pv_osage_init& i : pv->osage_init) { - uint32_t motion_id = aft_mot_db->get_motion_id(i.motion.c_str()); - if (motion_id == -1) + uint32_t motnum = aft_mot_db->get_motion_id(i.motion.c_str()); + if (motnum == -1) continue; osage_init_data osage_init; osage_init.rob_chr = chr.rob_chr; osage_init.pv_id = pv->id; - osage_init.motion_id = motion_id; + osage_init.motnum = motnum; osage_init.dir.assign(pv->mdata.dir); osage_init.frame = i.frame; vec.push_back(osage_init); } - skin_param_manager_add_task(chr.chara_id, vec); + skin_param_manager_add_task(chr.rob_id, vec); } bool pv_game::set_pv_param_post_process_bloom_data(bool set, int32_t id, float_t duration) { @@ -4598,19 +4579,18 @@ bool pv_game::set_pv_param_post_process_bloom_data(bool set, int32_t id, float_t return true; } -void pv_game::set_pv_param_post_process_chara_alpha_data(int32_t chara_id, +void pv_game::set_pv_param_post_process_chara_alpha_data(ROB_ID rob_id, float_t alpha, int32_t type, float_t duration) { - if (chara_id >= 0 && chara_id < ROB_ID_MAX) + if (rob_id >= 0 && rob_id < ROB_ID_MAX) pv_param_task::post_process_task_set_chara_alpha( - chara_id, type, alpha, duration); + rob_id, type, alpha, duration); } -void pv_game::set_pv_param_post_process_chara_item_alpha_data(int32_t chara_id, +void pv_game::set_pv_param_post_process_chara_item_alpha_data(ROB_ID rob_id, float_t alpha, int32_t type, float_t duration) { - if (chara_id >= 0 && chara_id < ROB_ID_MAX) + if (rob_id >= 0 && rob_id < ROB_ID_MAX) pv_param_task::post_process_task_set_chara_item_alpha( - chara_id, type, alpha, duration, - pv_game::chara_item_alpha_callback, this); + rob_id, type, alpha, duration, pv_game::chara_item_alpha_callback, this); } bool pv_game::set_pv_param_post_process_color_correction_data(bool set, int32_t id, float_t duration) { @@ -4743,18 +4723,14 @@ bool pv_game::unload() { } for (pv_game_chara& i : data.chara) { - if (i.chara_id != -1 && i.rob_chr) { - skin_param_manager_reset(i.chara_id); - rob_chara_array_free_chara_id(i.chara_id); + if (i.rob_id != ROB_ID_NULL && i.rob_chr) { + skin_param_manager_reset(i.rob_id); + RobManagement* rob_mon = get_rob_management(); + if (rob_mon) + rob_mon->dest_rob(i.rob_id); } - i.chara_num = CN_MAX; - i.cos = -1; - i.chara_id = -1; - i.pv_data = {}; - i.rob_chr = 0; - i.motion_ids.clear(); - i.motion_face_ids.clear(); + i.init(); } osage_play_data_manager_reset(); @@ -5050,8 +5026,8 @@ void pv_game::sub_1401230A0() { sub_14013C8C0()->field_26 = true; } -void pv_game::chara_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha) { - if (!data || chara_id < 0 || chara_id >= ROB_ID_MAX) +void pv_game::chara_item_alpha_callback(void* data, ROB_ID rob_id, int32_t type, float_t alpha) { + if (!data || rob_id < 0 || rob_id >= ROB_ID_MAX) return; mdl::ObjFlags flags; @@ -5068,13 +5044,13 @@ void pv_game::chara_item_alpha_callback(void* data, int32_t chara_id, int32_t ty break; } - for (auto& i : ((pv_game*)data)->data.itmpv[chara_id]) + for (auto& i : ((pv_game*)data)->data.itmpv[rob_id]) i.second.first.set_alpha_obj_flags(alpha, flags); } void pv_game::get_item_mask(pv_performer_type type, - rob_chara_pv_data_item* src_item, pv_game_item_mask* src_mask, - rob_chara_pv_data_item* dst_item, pv_game_item_mask* dst_mask) { + RobItemEquipInit* src_item, pv_game_item_mask* src_mask, + RobItemEquipInit* dst_item, pv_game_item_mask* dst_mask) { if (!src_item || !src_mask || !dst_item || !dst_mask) return; @@ -5105,7 +5081,7 @@ void pv_game_init_data::reset() { for (int32_t& i : modules) i = 0; - for (rob_chara_pv_data_item& i : items) + for (RobItemEquipInit& i : items) i = {}; for (pv_game_item_mask& i : items_mask) @@ -5868,11 +5844,11 @@ void task_pv_game_init_pv() { for (int32_t i = 0; i < ROB_ID_MAX; i++) { args.init_data.modules[i] = v2->field_2C.field_4C[i]; for (int32_t j = 0; j < 4; j++) { - int32_t item_no = 0; + uint32_t item_no = 0; if (v2->field_2C.field_7C[i].arr[j] >= 0) item_no = customize_item_data_handler_data_get_customize_item_obj_id( v2->field_2C.field_7C[i].arr[j]); - args.init_data.items[i].arr[j] = item_no; + args.init_data.items[i].item_no[j] = item_no; args.init_data.items_mask[i].arr[j] = v2->field_2C.field_DC[i].arr[j]; } } @@ -5954,7 +5930,7 @@ bool task_pv_game_init_demo_pv(int32_t pv_id, pv_difficulty difficulty, bool mus else task_pv_game->data.init_data.modules[i] = 0; - for (int32_t& j : task_pv_game->data.init_data.items[i].arr) + for (uint32_t& j : task_pv_game->data.init_data.items[i].item_no) j = 0; for (bool& j : task_pv_game->data.init_data.items_mask[i].arr) @@ -6285,10 +6261,10 @@ static FrameRateControl* get_diva_pv_frame_rate() { return &diva_pv_frame_rate; } -static SysFrameRate* sys_frame_rate_get(int32_t chara_id) { - if (chara_id < 0 || chara_id >= 3) - chara_id = 0; - return &sys_frame_rate_array[chara_id]; +static SysFrameRate* sys_frame_rate_get(int32_t id) { + if (id < ROB_ID_1P || id > ROB_ID_3P) + id = ROB_ID_1P; + return &sys_frame_rate_array[id]; } static int32_t sub_1400FCFD0(pv_game_chara* arr, const pv_db_pv* pv) { @@ -6321,8 +6297,8 @@ static void sub_140105010(pv_game_chara* arr, size_t max_count, pv_game_item_mas if (module_data_handler_data_get_module(a4.module, mdl)) { chr->chara_num = mdl.chara_num; chr->cos = mdl.cos; - chr->pv_data.sleeve_l = mdl.sleeve_l; - chr->pv_data.sleeve_r = mdl.sleeve_r; + chr->rob_init.sleeve_l = mdl.sleeve_l; + chr->rob_init.sleeve_r = mdl.sleeve_r; } else { chr->chara_num = CN_MIKU; @@ -6330,11 +6306,11 @@ static void sub_140105010(pv_game_chara* arr, size_t max_count, pv_game_item_mas } } - chr->pv_data.item = a4.item; + chr->rob_init.item = a4.item; /*for (int32_t i = 0; i < PV_PERFORMER_ITEM_MAX; i++) if (sub_140234860()->sub_140234460(chr->pv_data.item.arr[i]) < 0) - chr->pv_data.item.arr[i] = 0;*/ + chr->rob_init.item.arr[i] = 0;*/ const pv_db_pv* pv = a4.pv; PlayerData* player_data = player_data_array_get(0); @@ -6355,8 +6331,8 @@ static void sub_140105010(pv_game_chara* arr, size_t max_count, pv_game_item_mas pv_performer_type type = pv->get_performer_type(performer); costume = pv_db_pv::get_pseudo_costume(type, pseudo_chr->chara_num, pseudo_chr->cos); - pv_game::get_item_mask(type, &pseudo_chr->pv_data.item, - &a3[pseudo_performer], &chr->pv_data.item, &a3[performer]); + pv_game::get_item_mask(type, &pseudo_chr->rob_init.item, + &a3[pseudo_performer], &chr->rob_init.item, &a3[performer]); } } } @@ -6379,23 +6355,23 @@ static void sub_140105010(pv_game_chara* arr, size_t max_count, pv_game_item_mas pv_performer_item item = PV_PERFORMER_ITEM_ZUJO; for (int32_t i = 0; i < PV_PERFORMER_ITEM_MAX; i++) { - int32_t item_no = pv->get_performer_item(performer, item); + uint32_t item_no = pv->get_performer_item(performer, item); if (item_no == -2) { - const item_cos_data* cos = item_table_handler_array_get_item_cos_data(chr->chara_num, chr->cos); - if (!cos) + const RobItemEquip* item_set = get_default_costume_data(chr->chara_num, chr->cos); + if (!item_set) continue; - item_sub_id sub_id = pv_performer_item_to_item_sub_id(item); - if (sub_id < 0 || sub_id >= ITEM_SUB_MAX) + ROB_ITEM_EQUIP_SUB_ID sub_id = pv_performer_item_to_item_sub_id(item); + if (sub_id < 0 || sub_id >= ROB_ITEM_EQUIP_SUB_ID_MAX) continue; - chr->pv_data.item.arr[i] = cos->arr[sub_id]; + chr->rob_init.item.item_no[i] = item_set->item_no[sub_id]; a3[performer].arr[i] = true; } else if (item_no > 0) { - const item_table_item* itm = item_table_handler_array_get_item(chr->chara_num, item_no); - if (itm && itm->sub_id == pv_performer_item_to_item_sub_id(item)) - chr->pv_data.item.arr[i] = item_no; + const RobItemTable* tbl = get_rob_item_table(chr->chara_num, item_no); + if (tbl && tbl->equip_sub_id == pv_performer_item_to_item_sub_id(item)) + chr->rob_init.item.item_no[i] = item_no; } } } diff --git a/src/ReDIVA/pv_game/pv_game.hpp b/src/ReDIVA/pv_game/pv_game.hpp index c8eeb3cc..b3efb09d 100644 --- a/src/ReDIVA/pv_game/pv_game.hpp +++ b/src/ReDIVA/pv_game/pv_game.hpp @@ -42,8 +42,8 @@ enum hit_state { struct pv_game_chara { CHARA_NUM chara_num; int32_t cos; - int32_t chara_id; - rob_chara_pv_data pv_data; + ROB_ID rob_id; + RobInit rob_init; rob_chara* rob_chr; std::vector motion_ids; std::vector motion_face_ids; @@ -52,7 +52,7 @@ struct pv_game_chara { ~pv_game_chara(); bool check_chara(); - void reset(); + void init(); }; struct pv_game_edit_effect_data { @@ -346,7 +346,7 @@ struct pv_game { int32_t pv_id; bool field_14; int32_t modules[ROB_ID_MAX]; - rob_chara_pv_data_item items[ROB_ID_MAX]; + RobItemEquipInit items[ROB_ID_MAX]; pv_game_item_mask items_mask[ROB_ID_MAX]; pv_game_data data; @@ -377,7 +377,7 @@ struct pv_game { void edit_effect_ctrl(float_t delta_time); void edit_effect_set(int32_t index, float_t frame_speed, float_t delta_time); void edit_instrument_reset(); - void edit_instrument_set_disp(int32_t chara_id, bool value); + void edit_instrument_set_disp(int32_t rob_id, bool value); void end(bool complete, bool set_fade); float_t get_aet_frame_max_frame(int32_t aet_frame, int32_t aet_index, std::pair& aet_name_id, int64_t dsc_time, int64_t curr_time, float_t* max_frame); @@ -392,7 +392,7 @@ struct pv_game { auth_3d_id get_auth_3d_id(int32_t uid); int64_t get_auth_3d_time(int32_t uid, uint8_t type); uint32_t get_chreff_auth_3d_object_set(int32_t& uid); - int64_t get_data_itmpv_time(int32_t chara_id, int32_t index); + int64_t get_data_itmpv_time(int32_t rob_id, int32_t index); float_t get_data_rival_percentage(); std::string get_effect_se_file_name(); int32_t get_field_aet_frame_by_name_id(pv_game_field& field, @@ -433,24 +433,24 @@ struct pv_game { void restart(); void set_chara_use_opd(bool value); void set_data_campv(int32_t type, int32_t index, float_t frame); - void set_data_itmpv(int32_t chara_id, int32_t index, bool enable, int64_t time); - void set_data_itmpv_chara_id(int32_t chara_id, int32_t index, bool attach); - void set_data_itmpv_req_frame(int32_t chara_id, int32_t index, float_t value); - void set_data_itmpv_max_frame(int32_t chara_id, float_t value); - void set_data_itmpv_max_frame(int32_t chara_id, int32_t index, float_t value); - void set_data_itmpv_visibility(int32_t chara_id, bool value); - void set_data_itmpv_visibility(int32_t chara_id, int32_t index, bool value); - void set_edit_instrument(int32_t chara_id, bool disp, int32_t index, float_t frame, float_t frame_speed); + void set_data_itmpv(int32_t rob_id, int32_t index, bool enable, int64_t time); + void set_data_itmpv_chara_id(int32_t rob_id, int32_t index, bool attach); + void set_data_itmpv_req_frame(int32_t rob_id, int32_t index, float_t value); + void set_data_itmpv_max_frame(int32_t rob_id, float_t value); + void set_data_itmpv_max_frame(int32_t rob_id, int32_t index, float_t value); + void set_data_itmpv_visibility(int32_t rob_id, bool value); + void set_data_itmpv_visibility(int32_t rob_id, int32_t index, bool value); + void set_edit_instrument(int32_t rob_id, bool disp, int32_t index, float_t frame, float_t frame_speed); void set_eyes_adjust(pv_game_chara* chr); - void set_item(size_t performer, rob_chara_pv_data_item& value); + void set_item(size_t performer, RobItemEquipInit& value); void set_item_mask(size_t performer, size_t item, bool value); void set_lyric(int32_t lyric_index, color4u8 lyric_color); void set_module(size_t performer, int32_t module); void set_osage_init(const pv_game_chara& chr); bool set_pv_param_post_process_bloom_data(bool set, int32_t id, float_t duration); - void set_pv_param_post_process_chara_alpha_data(int32_t chara_id, + void set_pv_param_post_process_chara_alpha_data(ROB_ID rob_id, float_t alpha, int32_t type, float_t duration); - void set_pv_param_post_process_chara_item_alpha_data(int32_t chara_id, + void set_pv_param_post_process_chara_item_alpha_data(ROB_ID rob_id, float_t alpha, int32_t type, float_t duration); bool set_pv_param_post_process_color_correction_data(bool set, int32_t id, float_t duration); bool set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration); @@ -468,10 +468,10 @@ struct pv_game { int32_t sub_140112C00(int32_t index); void sub_1401230A0(); - static void chara_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha); + static void chara_item_alpha_callback(void* data, ROB_ID rob_id, int32_t type, float_t alpha); static void get_item_mask(pv_performer_type type, - rob_chara_pv_data_item* src_item, pv_game_item_mask* src_mask, - rob_chara_pv_data_item* dst_item, pv_game_item_mask* dst_mask); + RobItemEquipInit* src_item, pv_game_item_mask* src_mask, + RobItemEquipInit* dst_item, pv_game_item_mask* dst_mask); }; struct pv_game_init_data { @@ -483,7 +483,7 @@ struct pv_game_init_data { int32_t life_gauge_border; int32_t stage_index; int32_t modules[ROB_ID_MAX]; - rob_chara_pv_data_item items[ROB_ID_MAX]; + RobItemEquipInit items[ROB_ID_MAX]; pv_game_item_mask items_mask[ROB_ID_MAX]; pv_game_init_data(); diff --git a/src/ReDIVA/pv_game/pv_game_camera.cpp b/src/ReDIVA/pv_game/pv_game_camera.cpp index 58af1452..6394ba16 100644 --- a/src/ReDIVA/pv_game/pv_game_camera.cpp +++ b/src/ReDIVA/pv_game/pv_game_camera.cpp @@ -25,7 +25,7 @@ struct pv_game_camera { vec3 up_vec; float_t fov; float_t min_dist; - int32_t chara_id; + ROB_ID rob_id; int32_t chara_follow_point; float_t acceleration_1; float_t acceleration_2; @@ -47,7 +47,7 @@ static bool pv_game_camera_get_edit_camera(cam_struct* cam, float_t delta_time); static bool pv_game_camera_get_move_camera(cam_struct* cam, float_t delta_time); pv_game_camera::pv_game_camera() : enable(), follow_chara(), edit_camera(), duration(), curr_time(), -start_distance(), end_distance(), fov(), min_dist(), chara_id(), chara_follow_point(), +start_distance(), end_distance(), fov(), min_dist(), rob_id(), chara_follow_point(), acceleration_1(), acceleration_2(), field_F4(), acceleration(), acceleration_curr_time() { } @@ -68,7 +68,7 @@ void pv_game_camera::reset() { up_vec = { 0.0f, 1.0f, 0.0f }; fov = 32.2673416137695f; min_dist = 0.05f; - chara_id = 0; + rob_id = ROB_ID_1P; chara_follow_point = 0; acceleration_1 = 0.0f; acceleration_2 = 1.0f; @@ -106,7 +106,7 @@ void pv_game_camera_reset() { void pv_game_camera_set_dsc_data(float_t duration, pv_game_camera_dsc_data& start, pv_game_camera_dsc_data& end, float_t acceleration_1, float_t acceleration_2, - int32_t follow_chara, int32_t chara_id, int32_t chara_follow_point, bool edit_camera) { + int32_t follow_chara, int32_t rob_id, int32_t chara_follow_point, bool edit_camera) { pv_game_camera_data.reset(); pv_game_camera_data.edit_camera = edit_camera; @@ -141,7 +141,7 @@ void pv_game_camera_set_dsc_data(float_t duration, pv_game_camera_dsc_data& star if (follow_chara) { pv_game_camera_data.follow_chara = true; - pv_game_camera_data.chara_id = chara_id; + pv_game_camera_data.rob_id = (ROB_ID)rob_id; switch (chara_follow_point) { case 0: @@ -235,7 +235,7 @@ static bool pv_game_camera_get_edit_camera(cam_struct* cam, float_t delta_time) } if (pv_game_camera_data.follow_chara) { - rob_chara* rob_chr = rob_chara_array_get(pv_game_camera_data.chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob(pv_game_camera_data.rob_id); if (rob_chr) { mat4 mat = mat4_identity; rob_chr->sub_1405163C0(pv_game_camera_data.chara_follow_point, mat); @@ -282,7 +282,7 @@ static bool pv_game_camera_get_move_camera(cam_struct* cam, float_t delta_time) } if (pv_game_camera_data.follow_chara) { - rob_chara* rob_chr = rob_chara_array_get(pv_game_camera_data.chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob(pv_game_camera_data.rob_id); if (rob_chr) { mat4 mat = mat4_identity; rob_chr->sub_1405163C0(pv_game_camera_data.chara_follow_point, mat); diff --git a/src/ReDIVA/pv_game/pv_game_camera.hpp b/src/ReDIVA/pv_game/pv_game_camera.hpp index 3c333a06..7d51377e 100644 --- a/src/ReDIVA/pv_game/pv_game_camera.hpp +++ b/src/ReDIVA/pv_game/pv_game_camera.hpp @@ -20,5 +20,5 @@ extern void pv_game_camera_ctrl(float_t delta_time); extern void pv_game_camera_reset(); extern void pv_game_camera_set_dsc_data(float_t duration, pv_game_camera_dsc_data& start, pv_game_camera_dsc_data& end, float_t acceleration_1, float_t acceleration_2, - int32_t follow_chara, int32_t chara_id, int32_t chara_follow_point, bool edit_camera); + int32_t follow_chara, int32_t rob_id, int32_t chara_follow_point, bool edit_camera); extern void pv_game_camera_set_fov_min_dist(float_t fov, float_t min_dist); diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.cpp b/src/ReDIVA/pv_game/pv_game_pv_data.cpp index 39fa2930..0e60b0ba 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.cpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.cpp @@ -17,60 +17,60 @@ struct struc_595 { const char* name; - int32_t mottbl_index; + MOTTABLE_TYPE mottbl_type; int32_t type; int32_t field_10; }; struct struc_595 stru_1409A0AA0[] = { - { u8"通常", 0xA7, 0, 0 }, - { u8"カメラ目線", 0xA7, 1, 0 }, - { u8"上", 0xA9, 0, 0 }, - { u8"下", 0xAB, 0, 0 }, - { u8"左", 0xAD, 0, 0 }, - { u8"右", 0xAF, 0, 0 }, - { u8"右上", 0xB3, 0, 0 }, - { u8"右下", 0xB7, 0, 0 }, - { u8"左上", 0xB1, 0, 0 }, - { u8"左下", 0xB5, 0, 0 }, - { u8"上 → 下", 0xB9, 2, 8 }, - { u8"下 → 上", 0xB9, 3, 8 }, - { u8"左 → 右", 0xBB, 2, 8 }, - { u8"右 → 左", 0xBB, 3, 8 }, - { u8"左上 → 右下", 0xBD, 2, 8 }, - { u8"右上 → 左下", 0xBF, 2, 8 }, - { u8"右下 → 左上", 0xBD, 3, 8 }, - { u8"左下 → 右上", 0xBF, 3, 8 }, - { u8"中央 → 上", 0xA9, 2, 8 }, - { u8"中央 → 下", 0xAB, 2, 8 }, - { u8"中央 → 左", 0xAD, 2, 8 }, - { u8"中央 → 右", 0xAF, 2, 8 }, - { u8"中央 → 右上", 0xB3, 2, 8 }, - { u8"中央 → 右下", 0xB7, 2, 8 }, - { u8"中央 → 左上", 0xB1, 2, 8 }, - { u8"中央 → 左下", 0xB5, 2, 8 }, - { u8"上 → 中央", 0xA9, 3, 8 }, - { u8"下 → 中央", 0xAB, 3, 8 }, - { u8"左 → 中央", 0xAD, 3, 8 }, - { u8"右 → 中央", 0xAF, 3, 8 }, - { u8"右上 → 中央", 0xB3, 3, 8 }, - { u8"右下 → 中央", 0xB7, 3, 8 }, - { u8"左上 → 中央", 0xB1, 3, 8 }, - { u8"左下 → 中央", 0xB5, 3, 8 }, + { u8"通常", MTP_EYES_RESET_OLD, 0, 0 }, + { u8"カメラ目線", MTP_EYES_RESET_OLD, 1, 0 }, + { u8"上", MTP_EYES_UP_OLD, 0, 0 }, + { u8"下", MTP_EYES_DOWN_OLD, 0, 0 }, + { u8"左", MTP_EYES_LEFT_OLD, 0, 0 }, + { u8"右", MTP_EYES_RIGHT_OLD, 0, 0 }, + { u8"右上", MTP_EYES_UP_RIGHT_OLD, 0, 0 }, + { u8"右下", MTP_EYES_DOWN_RIGHT_OLD, 0, 0 }, + { u8"左上", MTP_EYES_UP_LEFT_OLD, 0, 0 }, + { u8"左下", MTP_EYES_DOWN_LEFT_OLD, 0, 0 }, + { u8"上 → 下", MTP_EYES_MOVE_U_D_OLD, 2, 8 }, + { u8"下 → 上", MTP_EYES_MOVE_U_D_OLD, 3, 8 }, + { u8"左 → 右", MTP_EYES_MOVE_U_D, 2, 8 }, + { u8"右 → 左", MTP_EYES_MOVE_U_D, 3, 8 }, + { u8"左上 → 右下", MTP_EYES_MOVE_UL_DR_OLD, 2, 8 }, + { u8"右上 → 左下", MTP_EYES_MOVE_UR_DL_OLD, 2, 8 }, + { u8"右下 → 左上", MTP_EYES_MOVE_UL_DR_OLD, 3, 8 }, + { u8"左下 → 右上", MTP_EYES_MOVE_UR_DL_OLD, 3, 8 }, + { u8"中央 → 上", MTP_EYES_UP_OLD, 2, 8 }, + { u8"中央 → 下", MTP_EYES_DOWN_OLD, 2, 8 }, + { u8"中央 → 左", MTP_EYES_LEFT_OLD, 2, 8 }, + { u8"中央 → 右", MTP_EYES_RIGHT_OLD, 2, 8 }, + { u8"中央 → 右上", MTP_EYES_UP_RIGHT_OLD, 2, 8 }, + { u8"中央 → 右下", MTP_EYES_DOWN_RIGHT_OLD, 2, 8 }, + { u8"中央 → 左上", MTP_EYES_UP_LEFT_OLD, 2, 8 }, + { u8"中央 → 左下", MTP_EYES_DOWN_LEFT_OLD, 2, 8 }, + { u8"上 → 中央", MTP_EYES_UP_OLD, 3, 8 }, + { u8"下 → 中央", MTP_EYES_DOWN_OLD, 3, 8 }, + { u8"左 → 中央", MTP_EYES_LEFT_OLD, 3, 8 }, + { u8"右 → 中央", MTP_EYES_RIGHT_OLD, 3, 8 }, + { u8"右上 → 中央", MTP_EYES_UP_RIGHT_OLD, 3, 8 }, + { u8"右下 → 中央", MTP_EYES_DOWN_RIGHT_OLD, 3, 8 }, + { u8"左上 → 中央", MTP_EYES_UP_LEFT_OLD, 3, 8 }, + { u8"左下 → 中央", MTP_EYES_DOWN_LEFT_OLD, 3, 8 }, }; struct struc_595 stru_1409A0DD0[] = { - { u8"上", 0xA8, 0, 0 }, - { u8"下", 0xAA, 0, 0 }, - { u8"右", 0xAE, 0, 0 }, - { u8"左", 0xAC, 0, 0 }, - { u8"右上", 0xB2, 0, 0 }, - { u8"左上", 0xB0, 0, 0 }, - { u8"右下", 0xB6, 0, 0 }, - { u8"左下", 0xB4, 0, 0 }, - { u8"カメラ目線", 0xA6, 1, 0 }, - { u8"通常", 0xA6, 0, 0 }, - { u8"通常", 0xA5, 0, 0 }, + { u8"上", MTP_EYES_UP, 0, 0 }, + { u8"下", MTP_EYES_DOWN, 0, 0 }, + { u8"右", MTP_EYES_RIGHT, 0, 0 }, + { u8"左", MTP_EYES_LEFT, 0, 0 }, + { u8"右上", MTP_EYES_UP_RIGHT, 0, 0 }, + { u8"左上", MTP_EYES_UP_LEFT, 0, 0 }, + { u8"右下", MTP_EYES_DOWN_RIGHT, 0, 0 }, + { u8"左下", MTP_EYES_DOWN_LEFT, 0, 0 }, + { u8"カメラ目線", MTP_EYES_RESET, 1, 0 }, + { u8"通常", MTP_EYES_RESET, 0, 0 }, + { u8"通常", MTP_EYES_NULL, 0, 0 }, }; extern render_context* rctx_ptr; @@ -136,17 +136,17 @@ void pv_play_data_motion_data::ctrl_inner() { RobAngle ang; ang.set_deg(rot); - rob_chr->set_base_position_pos(pos); - rob_chr->set_base_position_yang(ang); + rob_chr->set_rob_pos(pos); + rob_chr->set_rob_yang(ang); rob_chr->set_osage_reset(); if (rob_chr->check_for_ageageagain_module()) { if (fabsf(vec3::distance(start_pos, end_pos) <= 0.000001f && fabsf(end_rot - start_rot) <= 0.000001f)) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } - rob_chara_age_age_array_set_step_full(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_step_full(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_step_full(rob_chr->idnm, 1); + rob_chara_age_age_array_set_step_full(rob_chr->idnm, 2); } } @@ -311,7 +311,7 @@ void struc_676::reset() { pv_game_pv_data::pv_game_pv_data() : field_0(), dsc_state(), play()/*, dsc_buffer(), dsc_buffer_counter()*/, dsc_data_ptr(), dsc_data_ptr_end(), field_2BF38(), curr_time(), curr_time_float(), prev_time_float(), -field_2BF50(), field_2BF60(), field_2BF64(), field_2BF68(), chara_id(), pv_game()/*, field_2BF80()*/, +field_2BF50(), field_2BF60(), field_2BF64(), field_2BF68(), rob_id(), pv_game()/*, field_2BF80()*/, music(), dsc_file_handler(), dsc_time(), music_playing(), field_2BFC4(), pv_end(), look_camera_enable(), field_2BFD5(), data_camera(), has_signature(), has_perf_id(), targets_remaining(), target_index(), scene_rot_y(), field_2C550(), branch_mode(), last_challenge_note(), field_2C560() { @@ -440,7 +440,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - pv_play_data* playdata = &this->playdata[chara_id]; + pv_play_data* playdata = &this->playdata[rob_id]; rob_chara* rob_chr = playdata->rob_chr; switch (func) { @@ -457,8 +457,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, *dsc_time_offset = (float_t)((double_t)(curr_time - dsc_time) * 0.000000001); } break; case DSC_FT_MIKU_MOVE: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; vec3 pos; @@ -469,13 +469,13 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (rob_chr) { pos *= (pv_game->data.pv->edit == 2 ? 1.0f : 0.227f); mat4_transform_point(&scene_rot_mat, &pos, &pos); - rob_chr->set_base_position_pos(pos); + rob_chr->set_rob_pos(pos); rob_chr->set_osage_reset(); } } break; case DSC_FT_MIKU_ROT: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t rot = (float_t)data[1] * 0.001f; @@ -483,13 +483,13 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (rob_chr) { RobAngle ang; ang.set_deg(rot + scene_rot_y); - rob_chr->set_base_position_yang(ang); + rob_chr->set_rob_yang(ang); rob_chr->set_osage_reset(); } } break; case DSC_FT_MIKU_DISP: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t disp = data[1]; @@ -499,36 +499,36 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; if (disp == 1) { - rob_chr->set_visibility(true); + rob_chr->set_disp_flag(true); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } - pv_game->set_data_itmpv_visibility(chara_id, true); + pv_game->set_data_itmpv_visibility(rob_id, true); for (pv_play_data_set_motion& i : playdata->set_motion) { - bool set = rob_chr->set_motion_id(i.motion_id, i.frame, i.blend_duration, + bool set = rob_chr->replace_rob_motion(i.motion_id, i.frame, i.blend_duration, i.blend, 0, i.blend_type, aft_bone_data, aft_mot_db); rob_chr->set_motion_reset_data(i.motion_id, i.dsc_frame); rob_chr->bone_data->set_disable_eye_motion(i.disable_eye_motion); rob_chr->set_motion_step(i.frame_speed); if (set) pv_expression_array_set_motion(pv_game->data.pv-> - pv_expression_file_name.c_str(), chara_id, i.motion_id); + pv_expression_file_name.c_str(), rob_id, i.motion_id); if (!pv_game->data.pv->disable_calc_motfrm_limit) - set_motion_max_frame(chara_id, i.motion_index, i.dsc_time); + set_motion_max_frame(rob_id, i.motion_index, i.dsc_time); } playdata->set_motion.clear(); } else { - rob_chr->set_visibility(false); - pv_game->set_data_itmpv_visibility(chara_id, false); + rob_chr->set_disp_flag(false); + pv_game->set_data_itmpv_visibility(rob_id, false); } } break; case DSC_FT_MIKU_SHADOW: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_FT_TARGET: { @@ -541,8 +541,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } } break; case DSC_FT_SET_MOTION: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t motion_index = data[1]; @@ -592,21 +592,20 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!diff) break; - uint32_t motion_id = diff->get_motion_or_default(chara_id, motion_index).id; + uint32_t motion_id = diff->get_motion_or_default(rob_id, motion_index).id; if (pv_game_get()->data.pv) - motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->chara_id, - rob_chr->chara_num, diff->get_motion_or_default(chara_id, motion_index)); + motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->idnm, + rob_chr->chara_num, diff->get_motion_or_default(rob_id, motion_index)); - if (!motion_index) { - if (motion_id == -1) { - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(5); - if (motion_id == -1) - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); - } - } - else + if (motion_index) { if (motion_id == -1) - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + motion_id = rob_chr->get_common_mot(MTP_NONE); + } + else if (motion_id == -1) { + motion_id = rob_chr->get_common_mot(MTP_5); + if (motion_id == -1) + motion_id = rob_chr->get_common_mot(MTP_NONE); + } if (blend) blend_duration = 0.0f; @@ -627,11 +626,11 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, v518.dsc_time = motion ? motion->time : dsc_time; v518.dsc_frame = dsc_frame; - field_2C560.field_0[chara_id] = true; - field_2C560.field_8[chara_id] = v518; + field_2C560.field_0[rob_id] = true; + field_2C560.field_8[rob_id] = v518; if (playdata->disp) { - bool set = rob_chr->set_motion_id(motion_id, frame, blend_duration, + bool set = rob_chr->replace_rob_motion(motion_id, frame, blend_duration, blend, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); rob_chr->set_motion_reset_data(motion_id, dsc_frame); rob_chr->set_motion_skin_param(motion_id, dsc_frame); @@ -639,10 +638,10 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_motion_step(frame_speed); if (set) pv_expression_array_set_motion(pv_game->data.pv-> - pv_expression_file_name.c_str(), chara_id, motion_id); + pv_expression_file_name.c_str(), rob_id, motion_id); if (!pv_game->data.pv->disable_calc_motfrm_limit) - set_motion_max_frame(chara_id, motion_index, motion ? motion->time : 0); + set_motion_max_frame(rob_id, motion_index, motion ? motion->time : 0); } else { playdata->set_motion.clear(); @@ -651,8 +650,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } } break; case DSC_FT_SET_PLAYDATA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t motion_index = data[1]; @@ -750,8 +749,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, case DSC_FT_FADEOUT_FIELD: { } break; case DSC_FT_EYE_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t v114 = data[1]; @@ -768,8 +767,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, -1.0f, pv_game->data.get_anim_offset(), aft_mot_db); } break; case DSC_FT_MOUTH_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t mouth_anim_id = data[2]; @@ -795,18 +794,18 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, value = 1.0f; if (rob_chr) { - int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); - if (pv_game->data.field_2D090 && mottbl_index != 144) + MOTTABLE_TYPE mottbl_type = mouth_anim_id_to_mottbl_type(mouth_anim_id); + if (pv_game->data.field_2D090 && mottbl_type != 144) value = 0.0f; - rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_mouth_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration / anim_frame_speed, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), aft_mot_db); } } break; case DSC_FT_HAND_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t hand_index = data[1]; @@ -833,15 +832,15 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, value = 1.0f; if (rob_chr) { - int32_t mottbl_index = hand_anim_id_to_mottbl_index(hand_anim_id); + MOTTABLE_TYPE mottbl_type = hand_anim_id_to_mottbl_type(hand_anim_id); switch (hand_index) { case 0: - rob_chr->set_hand_l_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_l_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration / anim_frame_speed, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), aft_mot_db); break; case 1: - rob_chr->set_hand_r_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_r_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration / anim_frame_speed, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), aft_mot_db); break; @@ -849,8 +848,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } } break; case DSC_FT_LOOK_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t look_anim_id = data[1]; @@ -876,17 +875,17 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, value = 1.0f; if (rob_chr) { - int32_t mottbl_index = look_anim_id_to_mottbl_index(look_anim_id); - rob_chr->set_eyes_mottbl_motion(0, mottbl_index, value, - mottbl_index == 224 + MOTTABLE_TYPE mottbl_type = look_anim_id_to_mottbl_type(look_anim_id); + rob_chr->set_eyes_mottbl_motion(0, mottbl_type, value, + mottbl_type == MTP_EYES_BASE_MOT ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration / anim_frame_speed, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), aft_mot_db); } } break; case DSC_FT_EXPRESSION: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t expression_id = data[1]; @@ -912,20 +911,20 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, value = 1.0f; if (rob_chr) { - int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); + MOTTABLE_TYPE mottbl_type = expression_id_to_mottbl_type(expression_id); bool v167 = true; if (has_perf_id) v167 = pv_game->data.pv->edit != 1 && pv_game->data.pv->edit != 2; - rob_chr->set_face_mottbl_motion(0, mottbl_index, value, - mottbl_index >= 214 && mottbl_index <= 223 + rob_chr->set_face_mottbl_motion(0, mottbl_type, value, + mottbl_type >= MTP_FACE_MOT_SLOT_1 && mottbl_type <= MTP_FACE_MOT_SLOT_10 ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration / anim_frame_speed, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), v167, aft_mot_db); } } break; case DSC_FT_LOOK_CAMERA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t enable = data[1]; @@ -1055,24 +1054,24 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, const pv_db_pv_difficulty* diff = pv_game->data.pv->get_difficulty( sub_14013C8C0()->difficulty, sub_14013C8C0()->edition); if (diff) { - motion_id = diff->get_motion_or_default(chara_id, motion_index).id; + motion_id = diff->get_motion_or_default(rob_id, motion_index).id; if (pv_game_get()->data.pv) - motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->chara_id, - rob_chr->chara_num, diff->get_motion_or_default(chara_id, motion_index)); + motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->idnm, + rob_chr->chara_num, diff->get_motion_or_default(rob_id, motion_index)); if (motion_id == -1) - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + motion_id = rob_chr->get_common_mot(MTP_NONE); } else - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + motion_id = rob_chr->get_common_mot(MTP_NONE); frame_speed *= anim_frame_speed; - float_t frame_count = motion_storage_get_mot_data_frame_count(motion_id, aft_mot_db) - 1.0f; - float_t frame = frame_count * value; - if (pv_game->data.use_osage_play_data && frame_count > 0.0f) + float_t frame_max = get_mot_frame_max(motion_id, aft_mot_db) - 1.0f; + float_t frame = frame_max * value; + if (pv_game->data.use_osage_play_data && frame_max > 0.0f) frame = fmodf((dsc_time_to_frame(curr_time - dsc_time) * frame_speed) - + frame_count * value, frame_count); + + frame_max * value, frame_max); float_t blend_duration = playdata->motion_data.mot_smooth_len / anim_frame_speed; MotionBlendType blend_type = MOTION_BLEND_CROSS; @@ -1109,14 +1108,14 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, loop = false; if (playdata->disp || loop) { - rob_chr->set_motion_id(motion_id, frame, blend_duration, blend, 0, blend_type, aft_bone_data, aft_mot_db); + rob_chr->replace_rob_motion(motion_id, frame, blend_duration, blend, 0, blend_type, aft_bone_data, aft_mot_db); rob_chr->set_motion_step(frame_speed); if (loop) rob_chr->set_motion_loop(0.0f, -1.0f, -1); - field_2C560.field_148[chara_id] = true; - field_2C560.field_150[chara_id] = v518; - field_2C560.field_270[chara_id] = frame_count * value; + field_2C560.field_148[rob_id] = true; + field_2C560.field_150[rob_id] = v518; + field_2C560.field_270[rob_id] = frame_max * value; } else { playdata->set_motion.push_back(v518); @@ -1134,8 +1133,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, this->time_signature = time_signature; } break; case DSC_FT_SHADOWHEIGHT: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_FT_EDIT_FACE: @@ -1150,18 +1149,18 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, mouth_anim_id = data[1]; if (rob_chr) { - int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); + MOTTABLE_TYPE mottbl_type = expression_id_to_mottbl_type(expression_id); bool v236 = true; if (has_perf_id) v236 = pv_game->data.pv->edit != 1 && pv_game->data.pv->edit != 2; - rob_chr->set_face_mottbl_motion(0, mottbl_index, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_face_mottbl_motion(0, mottbl_type, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration / anim_frame_speed, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), v236, aft_mot_db); if (!has_perf_id) { - int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); - float_t value = pv_game->data.field_2D090 && mottbl_index != 144 ? 0.0f : 1.0f; - rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + MOTTABLE_TYPE mottbl_type = mouth_anim_id_to_mottbl_type(mouth_anim_id); + float_t value = pv_game->data.field_2D090 && mottbl_type != 144 ? 0.0f : 1.0f; + rob_chr->set_mouth_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, measured_fps * 0.1f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), aft_mot_db); } @@ -1211,17 +1210,17 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, acceleration_2 = (float_t)data[20] * 0.001f; int32_t follow_chara = 0; - int32_t chara_id = 0; + int32_t rob_id = 0; int32_t chara_follow_point = 0; if (func == DSC_FT_EDIT_CAMERA) { follow_chara = data[21]; - chara_id = data[22]; + rob_id = data[22]; chara_follow_point = data[23]; } pv_game_camera_set_fov_min_dist(fov, min_dist); pv_game_camera_set_dsc_data(duration, start, end, acceleration_1, acceleration_2, - follow_chara, chara_id, chara_follow_point, func == DSC_FT_EDIT_CAMERA); + follow_chara, rob_id, chara_follow_point, func == DSC_FT_EDIT_CAMERA); pv_game_camera_ctrl(0.0f); rctx_ptr->camera->set_fast_change_hist0(true); @@ -1234,8 +1233,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, return false; } case DSC_FT_SHADOWPOS: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_FT_EDIT_LYRIC: { @@ -1256,17 +1255,17 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!rob_chr) break; - int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); + MOTTABLE_TYPE mottbl_type = mouth_anim_id_to_mottbl_type(mouth_anim_id); blend_duration *= measured_fps; - float_t value = pv_game->data.field_2D090 && mottbl_index != 144 ? 0.0f : 1.0f; - rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + float_t value = pv_game->data.field_2D090 && mottbl_type != 144 ? 0.0f : 1.0f; + rob_chr->set_mouth_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, pv_game->data.get_anim_offset(), aft_mot_db); } break; case DSC_FT_SET_CHARA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_FT_EDIT_MOVE: { @@ -1326,7 +1325,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, Shadow* shad = shadow_ptr_get(); if (shad) - if (chara_id == 1) + if (rob_id == ROB_ID_2P) shad->blur_filter_enable[1] = playdata->shadow; else shad->blur_filter_enable[0] = playdata->shadow; @@ -1374,7 +1373,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, struc_595& v355 = func == DSC_FT_EDIT_EYE_ANIM ? stru_1409A0DD0[eye_anim_id] : stru_1409A0AA0[eye_anim_id]; - int32_t mottbl_index = v355.mottbl_index; + MOTTABLE_TYPE mottbl_type = v355.mottbl_type; float_t _blend_duration = blend_duration; bool rotation_enable = false; float_t value = 1.0f; @@ -1390,20 +1389,20 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, value = 0.0f; playback_state = ROB_PARTIAL_MOTION_PLAYBACK_FORWARD; loop_state = ROB_PARTIAL_MOTION_LOOP_ONCE; - float_t frame_count = motion_storage_get_mot_data_frame_count( - rob_chr->get_rob_cmn_mottbl_motion_id(mottbl_index), aft_mot_db) - 1.0f; - step = v533 > 0.0f ? frame_count / measured_fps * v533 : 1.0f; + float_t frame_max = get_mot_frame_max( + rob_chr->get_common_mot(mottbl_type), aft_mot_db) - 1.0f; + step = v533 > 0.0f ? frame_max / measured_fps * v533 : 1.0f; } break; case 3: { playback_state = ROB_PARTIAL_MOTION_PLAYBACK_BACKWARD; loop_state = ROB_PARTIAL_MOTION_LOOP_ONCE; - float_t frame_count = motion_storage_get_mot_data_frame_count( - rob_chr->get_rob_cmn_mottbl_motion_id(mottbl_index), aft_mot_db) - 1.0f; - step = v533 > 0.0f ? frame_count / measured_fps * v533 : 1.0f; + float_t frame_max = get_mot_frame_max( + rob_chr->get_common_mot(mottbl_type), aft_mot_db) - 1.0f; + step = v533 > 0.0f ? frame_max / measured_fps * v533 : 1.0f; } break; } - rob_chr->set_eyes_mottbl_motion(0, mottbl_index, value, playback_state, + rob_chr->set_eyes_mottbl_motion(0, mottbl_type, value, playback_state, _blend_duration, 0.0f, step, loop_state, pv_game->data.get_anim_offset(), aft_mot_db); if (pv_game->data.pv->is_old_pv) @@ -1435,36 +1434,36 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, playdata->disp = disp == 1; if (rob_chr) if (disp == 1) { - rob_chr->set_visibility(true); + rob_chr->set_disp_flag(true); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } for (pv_play_data_set_motion& i : playdata->set_motion) { - bool set = rob_chr->set_motion_id(i.motion_id, i.frame, i.blend_duration, + bool set = rob_chr->replace_rob_motion(i.motion_id, i.frame, i.blend_duration, i.blend, false, i.blend_type, aft_bone_data, aft_mot_db); rob_chr->bone_data->set_disable_eye_motion(i.disable_eye_motion); rob_chr->set_motion_step(i.frame_speed); if (set) pv_expression_array_set_motion(pv_game->data.pv-> - pv_expression_file_name.c_str(), chara_id, i.motion_id); + pv_expression_file_name.c_str(), rob_id, i.motion_id); } playdata->set_motion.clear(); } else - rob_chr->set_visibility(false); + rob_chr->set_disp_flag(false); - pv_game->edit_instrument_set_disp(chara_id, playdata->disp); + pv_game->edit_instrument_set_disp(rob_id, playdata->disp); } break; case DSC_FT_AIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_FT_HAND_ITEM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t hand_index = data[1]; @@ -1521,8 +1520,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, pv_game_camera_set_fov_min_dist(_fov, _min_dist); } break; case DSC_FT_CLOTH_WET: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t wet = (float_t)data[0] * 0.001f; @@ -1530,7 +1529,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, wet = clamp_def(wet, 0.0f, 1.0f); if (rob_chr) - rob_chr->rob_disp->wet = wet; + rob_chr->disp->wet_cloth = wet; } break; case DSC_FT_LIGHT_ROT: { } break; @@ -1570,8 +1569,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rctx_ptr->render.set_scene_fade_blend_func(blend_func, 1); } break; case DSC_FT_AUTO_BLINK: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t enable = data[0]; @@ -1583,8 +1582,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->autoblink_disable(); } break; case DSC_FT_PARTS_DISP: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t id = data[1]; @@ -1600,8 +1599,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, field_2BF80->field_0.target_flying_time = target_flying_time;*/ } break; case DSC_FT_CHARA_SIZE: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t chara_size = data[1]; @@ -1612,11 +1611,11 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (chara_size == 0) chara_size_index = rob_data_get_chara_size_index(rob_chr->chara_num); else if (chara_size == 1) - chara_size_index = rob_data_get_chara_size_index(pv_game->data.pv->get_performer_chara(chara_id)); + chara_size_index = rob_data_get_chara_size_index(pv_game->data.pv->get_performer_chara(rob_id)); else if (chara_size == 2) chara_size_index = 1; else if (chara_size == 3) { - chara_size_index = rob_chr->pv_data.chara_size_index; + chara_size_index = rob_chr->rob_init.chara_size_index; if (chara_size_index < 0 || chara_size_index > 4) break; } @@ -1630,8 +1629,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; } break; case DSC_FT_CHARA_HEIGHT_ADJUST: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t height_adjust = data[1]; @@ -1640,8 +1639,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_chara_height_adjust(height_adjust != 0); } break; case DSC_FT_ITEM_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t index = data[1]; @@ -1652,27 +1651,27 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; if (v290 == 2) { - int64_t time = pv_game->get_data_itmpv_time(chara_id, index); + int64_t time = pv_game->get_data_itmpv_time(rob_id, index); if (time >= 0 && time <= dsc_time && time <= curr_time) { float_t frame = dsc_time_to_frame(curr_time - time); float_t dsc_frame = prj::roundf(dsc_time_to_frame(dsc_time - time)); if (frame < dsc_frame) frame = dsc_frame; - pv_game->set_data_itmpv_req_frame(chara_id, index, frame); - set_item_anim_max_frame(chara_id, index, time); + pv_game->set_data_itmpv_req_frame(rob_id, index, frame); + set_item_anim_max_frame(rob_id, index, time); } } else if (v290 >= 0) { - pv_game->set_data_itmpv(chara_id, index, v290 != 0, dsc_time); - set_item_anim_max_frame(chara_id, index, dsc_time); + pv_game->set_data_itmpv(rob_id, index, v290 != 0, dsc_time); + set_item_anim_max_frame(rob_id, index, dsc_time); } if (disp >= 0) - pv_game->set_data_itmpv_visibility(chara_id, index, disp != 0); + pv_game->set_data_itmpv_visibility(rob_id, index, disp != 0); } break; case DSC_FT_CHARA_POS_ADJUST: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; vec3 pos; @@ -1685,8 +1684,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, mat4_transform_point(&scene_rot_mat, &pos, &pos); rob_chr->set_chara_pos_adjust(pos); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } } break; case DSC_FT_SCENE_ROT: { @@ -1696,8 +1695,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, mat4_rotate_y(scene_rot * DEG_TO_RAD_FLOAT, &scene_rot_mat); } break; case DSC_FT_EDIT_MOT_SMOOTH_LEN: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t value = data[1]; @@ -1763,8 +1762,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } } break; case DSC_FT_WIND: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t wind_strength_kami = (float_t)data[1] * 0.001f; @@ -1774,8 +1773,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_wind_strength(wind_strength_outer); } break; case DSC_FT_OSAGE_STEP: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t osage_step_kami = (float_t)data[1] * 0.001f; @@ -1785,8 +1784,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_osage_step(osage_step_outer); } break; case DSC_FT_OSAGE_MV_CCL: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t osage_mv_ccl_kami = (float_t)data[1] * 0.001f; @@ -1798,8 +1797,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } } break; case DSC_FT_CHARA_COLOR: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t chara_color = data[1]; @@ -1848,10 +1847,11 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, float_t frame_speed = (float_t)data[1] * 0.001f; if (rob_chr) { - field_2C560.field_288[chara_id] = index != -1; - field_2C560.field_290[chara_id] = index; - field_2C560.field_2A8[chara_id] = frame_speed; - pv_game->set_edit_instrument(chara_id, playdata->disp, index, rob_chr->get_frame(), frame_speed); + field_2C560.field_288[rob_id] = index != -1; + field_2C560.field_290[rob_id] = index; + field_2C560.field_2A8[rob_id] = frame_speed; + pv_game->set_edit_instrument(rob_id, playdata->disp, + index, rob_chr->get_frame(), frame_speed); } } break; case DSC_FT_PV_END_FADEOUT: { @@ -1865,15 +1865,15 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, case DSC_FT_TARGET_FLAG: { } break; case DSC_FT_ITEM_ANIM_ATTACH: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t index = data[1]; int32_t attach = data[2]; if (index >= 0) - pv_game->set_data_itmpv_chara_id(chara_id, index, attach == 1); + pv_game->set_data_itmpv_chara_id(rob_id, index, attach == 1); } break; case DSC_FT_SHADOW_RANGE: { float_t shadow_range_factor = (float_t)data[0] * 0.001f; @@ -1881,8 +1881,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, shadow_ptr_get()->shadow_range_factor = shadow_range_factor; } break; case DSC_FT_HAND_SCALE: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t hand = data[1]; @@ -1913,8 +1913,8 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, case DSC_FT_FACE_TYPE: { } break; case DSC_FT_SHADOW_CAST: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t shadow_cast = data[1]; @@ -1945,15 +1945,15 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, pv_game->set_pv_param_post_process_dof_data(set == 1, id, duration); } break; case DSC_FT_CHARA_ALPHA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t alpha = (float_t)data[1] * 0.001f; float_t duration = (float_t)data[2]; int32_t type = data[3]; - pv_game->set_pv_param_post_process_chara_alpha_data(chara_id, alpha, type, duration); + pv_game->set_pv_param_post_process_chara_alpha_data(rob_id, alpha, type, duration); } break; case DSC_FT_AOTO_CAP: { int32_t enable = data[0]; @@ -1981,15 +1981,15 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, case DSC_FT_SHIMMER: { } break; case DSC_FT_ITEM_ALPHA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t alpha = (float_t)data[1] * 0.001f; float_t duration = (float_t)data[2]; int32_t type = data[3]; - pv_game->set_pv_param_post_process_chara_item_alpha_data(chara_id, alpha, type, duration); + pv_game->set_pv_param_post_process_chara_item_alpha_data(rob_id, alpha, type, duration); } break; case DSC_FT_MOVIE_CUT_CHG: { int32_t index = data[0]; @@ -2051,7 +2051,7 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, light_stage->set_position(light_data.position); } break; case DSC_FT_AGEAGE_CTRL: { - int32_t chara_id = data[0]; + int32_t rob_id = (ROB_ID)data[0]; int32_t parts = data[1]; int32_t npr = data[2]; int32_t speed = data[3]; @@ -2060,14 +2060,14 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, switch (parts) { case 0: - rob_chara_age_age_array_set_params(chara_id, 1, npr, speed, skip, disp); - rob_chara_age_age_array_set_params(chara_id, 2, npr, speed, skip, disp); + rob_chara_age_age_array_set_params(rob_id, 1, npr, speed, skip, disp); + rob_chara_age_age_array_set_params(rob_id, 2, npr, speed, skip, disp); break; case 1: - rob_chara_age_age_array_set_params(chara_id, 1, npr, speed, skip, disp); + rob_chara_age_age_array_set_params(rob_id, 1, npr, speed, skip, disp); break; case 2: - rob_chara_age_age_array_set_params(chara_id, 2, npr, speed, skip, disp); + rob_chara_age_age_array_set_params(rob_id, 2, npr, speed, skip, disp); break; } } break; @@ -2201,11 +2201,11 @@ void pv_game_pv_data::find_data_camera() { } } -void pv_game_pv_data::find_playdata_item_anim(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +void pv_game_pv_data::find_playdata_item_anim(int32_t rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - std::vector& item_anim = playdata[chara_id].motion_data.item_anim; + std::vector& item_anim = playdata[rob_id].motion_data.item_anim; item_anim.clear(); int32_t pv_branch_mode = 0; @@ -2222,7 +2222,7 @@ void pv_game_pv_data::find_playdata_item_anim(int32_t chara_id) { } int32_t* data = dsc.get_func_data(i); - if (chara_id == data[0] && data[2] == 2) + if (rob_id == data[0] && data[2] == 2) item_anim.push_back({ time, data[1], pv_branch_mode }); prev_time = time; @@ -2230,11 +2230,11 @@ void pv_game_pv_data::find_playdata_item_anim(int32_t chara_id) { } } -void pv_game_pv_data::find_playdata_set_motion(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +void pv_game_pv_data::find_playdata_set_motion(int32_t rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - std::vector& set_motion = playdata[chara_id].motion_data.set_motion; + std::vector& set_motion = playdata[rob_id].motion_data.set_motion; set_motion.clear(); int32_t pv_branch_mode = 0; @@ -2251,7 +2251,7 @@ void pv_game_pv_data::find_playdata_set_motion(int32_t chara_id) { } int32_t* data = dsc.get_func_data(i); - if (chara_id == data[0]) + if (rob_id == data[0]) set_motion.push_back({ time, data[1], pv_branch_mode }); prev_time = time; @@ -2282,10 +2282,10 @@ void pv_game_pv_data::find_set_motion(const pv_db_pv_difficulty* diff) { int32_t* data = dsc.get_func_data(i); - int32_t chara_id = data[0]; + int32_t rob_id = (ROB_ID)data[0]; int32_t motion_index = data[1]; - set_playdata[chara_id].push_back({ time, motion_index, pv_branch_mode }); + set_playdata[rob_id].push_back({ time, motion_index, pv_branch_mode }); prev_time = time; i++; @@ -2355,7 +2355,7 @@ void pv_game_pv_data::find_set_motion(const pv_db_pv_difficulty* diff) { if (pv_game_get() && pv_game_get()->data.pv) { rob_chara* rob_chr = playdata.rob_chr; if (rob_chr) - motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->chara_id, + motion_id = pv_game_get()->data.pv->get_chrmot_motion_id(rob_chr->idnm, rob_chr->chara_num, diff->get_motion_or_default(i, j.index)); } @@ -2365,9 +2365,9 @@ void pv_game_pv_data::find_set_motion(const pv_db_pv_difficulty* diff) { } } -const std::vector* pv_game_pv_data::get_set_motion(size_t chara_id) { - if (chara_id >= 0 && chara_id < ROB_ID_MAX) - return &set_motion[chara_id]; +const std::vector* pv_game_pv_data::get_set_motion(size_t rob_id) { + if (rob_id >= 0 && rob_id < ROB_ID_MAX) + return &set_motion[rob_id]; return 0; } @@ -2397,19 +2397,19 @@ void pv_game_pv_data::init(::pv_game* pv_game, bool music_play) { for (int32_t i = 0; i < ROB_ID_MAX; i++) { pv_game_chara& chr = pv_game->data.chara[i]; - if (chr.chara_id == -1 || !chr.rob_chr) + if (chr.rob_id == ROB_ID_NULL || !chr.rob_chr) continue; pv_play_data& playdata = this->playdata[i]; playdata.reset(); playdata.set_motion.clear(); - if (chr.chara_id != -1) - playdata.rob_chr = rob_chara_array_get(chr.chara_id); + if (chr.rob_id != ROB_ID_NULL) + playdata.rob_chr = get_rob_management()->get_rob(chr.rob_id); if (playdata.rob_chr) { playdata.rob_chr->frame_speed = anim_frame_speed; - playdata.rob_chr->data.motion.step_data.step = anim_frame_speed; + playdata.rob_chr->rob_base.robmot.step.req_f = anim_frame_speed; pv_expression_array_set(i, playdata.rob_chr, anim_frame_speed); } @@ -2471,7 +2471,7 @@ void pv_game_pv_data::init(::pv_game* pv_game, bool music_play) { pv_game->data.play_data.lyric_color = 0xFFFFFFFF; field_0 = true; - chara_id = 0; + rob_id = ROB_ID_1P; field_2C560.reset(); @@ -2600,22 +2600,23 @@ void pv_game_pv_data::set_camera_max_frame(int64_t time) { } } -void pv_game_pv_data::set_item_anim_max_frame(int32_t chara_id, int32_t index, int64_t time) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX || index < 0) +void pv_game_pv_data::set_item_anim_max_frame(int32_t rob_id, int32_t index, int64_t time) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX || index < 0) return; - for (auto& i : playdata[chara_id].motion_data.item_anim) + for (auto& i : playdata[rob_id].motion_data.item_anim) if (10000LL * i.time > dsc_time && i.index == index && (!branch_mode || branch_mode == i.pv_branch_mode)) { - pv_game->set_data_itmpv_max_frame(chara_id, index, prj::roundf(dsc_time_to_frame(10000LL * i.time - time)) - 1.0f); + pv_game->set_data_itmpv_max_frame(rob_id, index, + prj::roundf(dsc_time_to_frame(10000LL * i.time - time)) - 1.0f); break; } } -void pv_game_pv_data::set_motion_max_frame(int32_t chara_id, int32_t motion_index, int64_t time) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX || motion_index < 0) +void pv_game_pv_data::set_motion_max_frame(int32_t rob_id, int32_t motion_index, int64_t time) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX || motion_index < 0) return; - pv_play_data& playdata = this->playdata[chara_id]; + pv_play_data& playdata = this->playdata[rob_id]; std::vector& set_motion = playdata.motion_data.set_motion; for (pv_play_data_event& i : set_motion) diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.hpp b/src/ReDIVA/pv_game/pv_game_pv_data.hpp index 0e450ac0..2c5be633 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.hpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.hpp @@ -274,7 +274,7 @@ struct pv_game_pv_data { bool field_2BF60; int32_t field_2BF64; int64_t field_2BF68; - int32_t chara_id; + ROB_ID rob_id; struct pv_game* pv_game; //struc_162* field_2BF80; struct pv_game_music* music; @@ -333,10 +333,10 @@ struct pv_game_pv_data { int32_t* pv_branch_mode, dsc_data* start, dsc_data* end); void find_change_fields(); void find_data_camera(); - void find_playdata_item_anim(int32_t chara_id); - void find_playdata_set_motion(int32_t chara_id); + void find_playdata_item_anim(int32_t rob_id); + void find_playdata_set_motion(int32_t rob_id); void find_set_motion(const struct pv_db_pv_difficulty* diff); - const std::vector* get_set_motion(size_t chara_id); + const std::vector* get_set_motion(size_t rob_id); pv_dsc_target_group* get_target(); int32_t get_target_target_count(size_t index, float_t time_offset, bool a4); void init(::pv_game* pv_game, bool music_play); @@ -345,6 +345,6 @@ struct pv_game_pv_data { void reset_camera_post_process(); void scene_fade_ctrl(float_t delta_time); void set_camera_max_frame(int64_t time); - void set_item_anim_max_frame(int32_t chara_id, int32_t index, int64_t time); - void set_motion_max_frame(int32_t chara_id, int32_t motion_index, int64_t time); + void set_item_anim_max_frame(int32_t rob_id, int32_t index, int64_t time); + void set_motion_max_frame(int32_t rob_id, int32_t motion_index, int64_t time); }; diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index b64e8950..207aa4a9 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -276,8 +276,8 @@ extern render_context* rctx_ptr; static vec4 bright_scale_get(int32_t index, float_t value); static float_t dsc_time_to_frame(int64_t time); -static vec3 x_pv_game_dof_callback(void* data, int32_t chara_id); -static void x_pv_game_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha); +static vec3 x_pv_game_dof_callback(void* data, ROB_ID rob_id); +static void x_pv_game_item_alpha_callback(void* data, ROB_ID rob_id, int32_t type, float_t alpha); static void x_pv_game_change_field(x_pv_game* xpvgm, int32_t field, int64_t dsc_time, int64_t curr_time); static void x_pv_game_reset_field(x_pv_game* xpvgm); @@ -871,14 +871,14 @@ void x_pv_play_data::reset() { bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - int32_t mottbl_index = hand_anim_id_to_mottbl_index(2); + MOTTABLE_TYPE mottbl_type = hand_anim_id_to_mottbl_type(2); - rob_chr->reset_data(&rob_chr->pv_data, aft_bone_data, aft_mot_db); - rob_chr->set_hand_l_mottbl_motion(0, mottbl_index, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->reset_rob(rob_chr->rob_init, aft_bone_data, aft_mot_db); + rob_chr->set_hand_l_mottbl_motion(0, mottbl_type, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_hand_r_mottbl_motion(0, mottbl_index, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_r_mottbl_motion(0, mottbl_type, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); - rob_chr->set_visibility(false); + rob_chr->set_disp_flag(false); } motion.clear(); @@ -917,7 +917,7 @@ void x_pv_game_song_effect_glitter::reset() { i = false; } -x_pv_game_song_effect::x_pv_game_song_effect() : enable(), chara_id(), time() { +x_pv_game_song_effect::x_pv_game_song_effect() : enable(), rob_id(), time() { reset(); } @@ -927,7 +927,7 @@ x_pv_game_song_effect::~x_pv_game_song_effect() { void x_pv_game_song_effect::reset() { enable = false; - chara_id = -1; + rob_id = ROB_ID_NULL; time = -1; auth_3d.clear(); auth_3d.shrink_to_fit(); @@ -1135,7 +1135,7 @@ void x_pv_game_effect::ctrl(object_database* obj_db, texture_database* tex_db) { for (x_pv_game_song_effect& i : song_effect) if (i.enable) for (x_pv_game_song_effect_auth_3d& j : i.auth_3d) - j.id.set_chara_id(i.chara_id); + j.id.set_chara_id(i.rob_id); } break; } } @@ -1211,18 +1211,18 @@ void x_pv_game_effect::reset() { frame_rate_control = 0; } -void x_pv_game_effect::set_chara_id(int32_t index, int32_t chara_id, bool chara_item) { +void x_pv_game_effect::set_chara_id(int32_t index, ROB_ID rob_id, bool chara_item) { if (index < 0 || index >= song_effect.size()) return; x_pv_game_song_effect& song_effect = this->song_effect[index]; for (x_pv_game_song_effect_auth_3d& i : song_effect.auth_3d) { - i.id.set_chara_id(chara_id); + i.id.set_chara_id(rob_id); i.id.set_chara_item(chara_item); } - song_effect.chara_id = chara_id; + song_effect.rob_id = rob_id; } void x_pv_game_effect::set_song_effect(int32_t index, int64_t time) { @@ -1242,10 +1242,10 @@ void x_pv_game_effect::set_song_effect(int32_t index, int64_t time) { pvpp* play_param = this->play_param; size_t chara_count = play_param->chara.size(); - int32_t chara_id = play_param->effect[index].chara_id; - if (chara_id < 0 || chara_id >= ROB_ID_MAX || chara_id >= chara_count) - chara_id = -1; - song_effect.chara_id = chara_id; + ROB_ID rob_id = (ROB_ID)play_param->effect[index].chara_id; + if (rob_id < 0 || rob_id >= ROB_ID_MAX || rob_id >= chara_count) + rob_id = ROB_ID_NULL; + song_effect.rob_id = rob_id; for (x_pv_game_song_effect_auth_3d& i : song_effect.auth_3d) { i.id.set_enable(true); @@ -1270,7 +1270,7 @@ void x_pv_game_effect::set_song_effect(int32_t index, int64_t time) { set_song_effect_time_inner(index, time, false); for (x_pv_game_song_effect_auth_3d& i : song_effect.auth_3d) - i.id.set_chara_id(chara_id); + i.id.set_chara_id(rob_id); } void x_pv_game_effect::set_song_effect_time(int32_t index, int64_t time, bool glitter) { @@ -1359,7 +1359,7 @@ void x_pv_game_effect::stop_song_effect(int32_t index, bool free_glitter) { i.scene_counter = 0; } - song_effect.chara_id = -1; + song_effect.rob_id = ROB_ID_NULL; song_effect.enable = false; } @@ -1503,16 +1503,16 @@ void x_pv_game_chara_effect::ctrl(int32_t pv_id, object_database* obj_db, textur } } -vec3 x_pv_game_chara_effect::get_node_translation(int32_t chara_id, +vec3 x_pv_game_chara_effect::get_node_translation(ROB_ID rob_id, int32_t chara_effect, int32_t objhrc_index, const char* node_name) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return 0.0f; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (!rob_chr) return 0.0f; - std::vector& chr_eff_auth = this->auth_3d[rob_chr->chara_id]; + std::vector& chr_eff_auth = this->auth_3d[rob_chr->idnm]; if (chara_effect < 0 || chara_effect >= chr_eff_auth.size()) return 0.0f; @@ -1706,11 +1706,11 @@ void x_pv_game_chara_effect::reset() { } } -void x_pv_game_chara_effect::set_chara_effect(int32_t chara_id, int32_t index, int64_t time) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +void x_pv_game_chara_effect::set_chara_effect(ROB_ID rob_id, int32_t index, int64_t time) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - std::vector& auth_3d = this->auth_3d[chara_id]; + std::vector& auth_3d = this->auth_3d[rob_id]; if (index < 0 || index >= auth_3d.size()) return; @@ -1755,11 +1755,11 @@ void x_pv_game_chara_effect::set_chara_effect(int32_t chara_id, int32_t index, i id.set_max_frame(max_frame); } -void x_pv_game_chara_effect::set_chara_effect_time(int32_t chara_id, int32_t index, int64_t time) { - if (!state || chara_id < 0 || chara_id >= ROB_ID_MAX) +void x_pv_game_chara_effect::set_chara_effect_time(ROB_ID rob_id, int32_t index, int64_t time) { + if (!state || rob_id < 0 || rob_id >= ROB_ID_MAX) return; - for (x_pv_game_chara_effect_auth_3d& i : auth_3d[chara_id]) { + for (x_pv_game_chara_effect_auth_3d& i : auth_3d[rob_id]) { if (!i.id.check_not_empty() || !i.id.get_enable()) continue; @@ -1792,11 +1792,11 @@ void x_pv_game_chara_effect::stop() { j.id.set_enable(false); } -void x_pv_game_chara_effect::stop_chara_effect(int32_t chara_id, int32_t index) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +void x_pv_game_chara_effect::stop_chara_effect(ROB_ID rob_id, int32_t index) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - for (x_pv_game_chara_effect_auth_3d& i : auth_3d[chara_id]) + for (x_pv_game_chara_effect_auth_3d& i : auth_3d[rob_id]) if (i.id.check_not_empty()) i.id.set_enable(false); } @@ -2739,7 +2739,7 @@ void x_pv_game_title::unload_data() { } x_pv_game_pv_data::x_pv_game_pv_data() : pv_game(), dsc_data_ptr(), dsc_data_ptr_end(), -play(), chara_id(), dsc_time(), pv_end(), playdata(), scene_rot_y(), branch_mode() { +play(), rob_id(), dsc_time(), pv_end(), playdata(), scene_rot_y(), branch_mode() { measured_fps = 60.0f; anim_frame_speed = 1.0f; scene_rot_mat = mat4_identity; @@ -2801,7 +2801,7 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; - x_pv_play_data* playdata = &this->playdata[chara_id]; + x_pv_play_data* playdata = &this->playdata[rob_id]; rob_chara* rob_chr = playdata->rob_chr; switch (func) { @@ -2820,8 +2820,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, #endif } break; case DSC_X_MIKU_MOVE: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; vec3 pos; @@ -2833,12 +2833,12 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; mat4_transform_point(&scene_rot_mat, &pos, &pos); - rob_chr->set_base_position_pos(pos); + rob_chr->set_rob_pos(pos); rob_chr->set_osage_reset(); } break; case DSC_X_MIKU_ROT: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t rot_y = (float_t)data[0] * 0.001f; @@ -2847,12 +2847,12 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; int16_t yang = (int32_t)((rot_y + scene_rot_y) * 32768.0f * (float_t)(1.0 / 180.0)); - rob_chr->data.position.yang = yang; + rob_chr->rob_base.position.yang = yang; rob_chr->set_osage_reset(); } break; case DSC_X_MIKU_DISP: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t disp = data[1]; @@ -2863,39 +2863,39 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; if (disp == 1) { - rob_chr->set_visibility(true); + rob_chr->set_disp_flag(true); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } for (x_pv_play_data_set_motion& i : playdata->set_motion) { - bool set = rob_chr->set_motion_id(i.motion_id, i.frame, i.blend_duration, + bool set = rob_chr->replace_rob_motion(i.motnum, i.frame, i.blend_duration, i.blend, false, i.blend_type, aft_bone_data, aft_mot_db); - rob_chr->set_motion_reset_data(i.motion_id, i.dsc_frame); + rob_chr->set_motion_reset_data(i.motnum, i.dsc_frame); rob_chr->bone_data->disable_eye_motion = i.disable_eye_motion; - rob_chr->data.motion.step_data.step = i.frame_speed; + rob_chr->rob_base.robmot.step.req_f = i.frame_speed; if (set) pv_expression_array_set_motion(pv_game->get_data() - .exp_file.hash_murmurhash, chara_id, i.motion_id); - set_motion_max_frame(chara_id, i.motion_index, i.dsc_time); + .exp_file.hash_murmurhash, rob_id, i.motnum); + set_motion_max_frame(rob_id, i.motion_index, i.dsc_time); } playdata->set_motion.clear(); } else - rob_chr->set_visibility(false); + rob_chr->set_disp_flag(false); } break; case DSC_X_MIKU_SHADOW: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_X_TARGET: { } break; case DSC_X_SET_MOTION: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; if (!rob_chr) @@ -2941,10 +2941,10 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, frame = 0.0f; } - uint32_t motion_id = -1; - int32_t chara_id = 0; + uint32_t motnum = -1; + int32_t rob_id = 0; for (pvpp_chara& i : pv_game->get_data().play_param->chara) { - if (chara_id++ != this->chara_id) + if (rob_id++ != this->rob_id) continue; int32_t mot_idx = 1; @@ -2956,20 +2956,20 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, size_t pos = name.find("PV832"); if (pos != -1) name.replace(pos, 5, "PV800", 5); - motion_id = aft_mot_db->get_motion_id(name.c_str()); + motnum = aft_mot_db->get_motion_id(name.c_str()); break; } break; } if (motion_index) { - if (motion_id == -1) - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + if (motnum == -1) + motnum = rob_chr->get_common_mot(MTP_NONE); } - else if (motion_id == -1) { - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(5); - if (motion_id == -1) - motion_id = rob_chr->get_rob_cmn_mottbl_motion_id(0); + else if (motnum == -1) { + motnum = rob_chr->get_common_mot(MTP_5); + if (motnum == -1) + motnum = rob_chr->get_common_mot(MTP_NONE); } if (blend) @@ -2979,7 +2979,7 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, x_pv_play_data_set_motion set_motion; set_motion.frame_speed = frame_speed * anim_frame_speed; - set_motion.motion_id = motion_id; + set_motion.motnum = motnum; set_motion.frame = frame; set_motion.blend_duration = blend_duration; set_motion.blend = blend; @@ -2990,26 +2990,26 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, set_motion.dsc_frame = dsc_frame; if (playdata->disp) { - bool set = rob_chr->set_motion_id(motion_id, frame, blend_duration, + bool set = rob_chr->replace_rob_motion(motnum, frame, blend_duration, blend, false, MOTION_BLEND_CROSS, aft_bone_data, aft_mot_db); - rob_chr->set_motion_reset_data(motion_id, dsc_frame); - rob_chr->set_motion_skin_param(motion_id, dsc_frame); + rob_chr->set_motion_reset_data(motnum, dsc_frame); + rob_chr->set_motion_skin_param(motnum, dsc_frame); rob_chr->bone_data->disable_eye_motion = true; - rob_chr->data.motion.step_data.step = set_motion.frame_speed; + rob_chr->rob_base.robmot.step.req_f = set_motion.frame_speed; if (set) pv_expression_array_set_motion(pv_game->get_data() - .exp_file.hash_murmurhash, this->chara_id, motion_id); - set_motion_max_frame(this->chara_id, motion_index, motion ? motion->time : 0); + .exp_file.hash_murmurhash, this->rob_id, motnum); + set_motion_max_frame(this->rob_id, motion_index, motion ? motion->time : 0); } else { playdata->set_motion.clear(); playdata->set_motion.push_back(set_motion); - rob_chr->data.motion.step_data.step = set_motion.frame_speed; + rob_chr->rob_base.robmot.step.req_f = set_motion.frame_speed; } } break; case DSC_X_SET_PLAYDATA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t motion_index = data[1]; @@ -3061,8 +3061,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_EYE_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t v115 = data[1]; @@ -3082,8 +3082,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_eyelid_mottbl_motion_from_face(v115, blend_duration, -1.0f, 0.0f, aft_mot_db); } break; case DSC_X_MOUTH_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t mouth_anim_id = data[2]; @@ -3142,15 +3142,15 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, case 31: mouth_anim_id = 42; break; } - int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); + MOTTABLE_TYPE mottbl_type = mouth_anim_id_to_mottbl_type(mouth_anim_id); blend_duration /= anim_frame_speed; - rob_chr->set_mouth_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_mouth_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); } break; case DSC_X_HAND_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t hand_index = data[1]; @@ -3179,23 +3179,23 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!rob_chr) break; - int32_t mottbl_index = hand_anim_id_to_mottbl_index(hand_anim_id); + MOTTABLE_TYPE mottbl_type = hand_anim_id_to_mottbl_type(hand_anim_id); blend_duration /= anim_frame_speed; switch (hand_index) { case 0: - rob_chr->set_hand_l_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_l_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); break; case 1: - rob_chr->set_hand_r_mottbl_motion(0, mottbl_index, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_hand_r_mottbl_motion(0, mottbl_type, value, ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); break; } } break; case DSC_X_LOOK_ANIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t look_anim_id = data[1]; @@ -3223,16 +3223,17 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!rob_chr) break; - int32_t mottbl_index = look_anim_id_to_mottbl_index(look_anim_id); + MOTTABLE_TYPE mottbl_type = look_anim_id_to_mottbl_type(look_anim_id); blend_duration /= anim_frame_speed; - rob_chr->set_eyes_mottbl_motion(0, mottbl_index, value, - mottbl_index == 224 ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_eyes_mottbl_motion(0, mottbl_type, value, + mottbl_type == MTP_EYES_BASE_MOT + ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); } break; case DSC_X_EXPRESSION: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t expression_id = data[1]; @@ -3260,11 +3261,11 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!rob_chr) break; - int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); + MOTTABLE_TYPE mottbl_type = expression_id_to_mottbl_type(expression_id); blend_duration /= anim_frame_speed; - rob_chr->set_face_mottbl_motion(0, mottbl_index, value, - mottbl_index >= 214 && mottbl_index <= 223 + rob_chr->set_face_mottbl_motion(0, mottbl_type, value, + mottbl_type >= MTP_FACE_MOT_SLOT_1 && mottbl_type <= MTP_FACE_MOT_SLOT_10 ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, blend_duration, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, true, aft_mot_db); @@ -3295,8 +3296,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_SHADOWHEIGHT: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_X_EDIT_FACE: { @@ -3305,10 +3306,10 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!rob_chr) break; - int32_t mottbl_index = expression_id_to_mottbl_index(expression_id); + MOTTABLE_TYPE mottbl_type = expression_id_to_mottbl_type(expression_id); - rob_chr->set_face_mottbl_motion(0, mottbl_index, 1.0f, - mottbl_index >= 214 && mottbl_index <= 223 + rob_chr->set_face_mottbl_motion(0, mottbl_type, 1.0f, + mottbl_type >= MTP_FACE_MOT_SLOT_1 && mottbl_type <= MTP_FACE_MOT_SLOT_10 ? ROB_PARTIAL_MOTION_PLAYBACK_CHARA_MOTION : ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.0f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, true, aft_mot_db); } break; @@ -3321,8 +3322,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, break; } break; case DSC_X_SHADOWPOS: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_X_EDIT_LYRIC: { @@ -3332,8 +3333,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_EDIT_MOUTH: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t mouth_anim_id = data[1]; @@ -3341,14 +3342,14 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, if (!rob_chr) break; - int32_t mottbl_index = mouth_anim_id_to_mottbl_index(mouth_anim_id); + MOTTABLE_TYPE mottbl_type = mouth_anim_id_to_mottbl_type(mouth_anim_id); - rob_chr->set_mouth_mottbl_motion(0, mottbl_index, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, + rob_chr->set_mouth_mottbl_motion(0, mottbl_type, 1.0f, ROB_PARTIAL_MOTION_PLAYBACK_STOP, 0.1f, 0.0f, 1.0f, ROB_PARTIAL_MOTION_LOOP_NONE, 0.0f, aft_mot_db); } break; case DSC_X_SET_CHARA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_X_EDIT_MOVE: { @@ -3376,8 +3377,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_AIM: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; } break; case DSC_X_HAND_ITEM: { @@ -3390,8 +3391,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_CLOTH_WET: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t wet = (float_t)data[1] * 0.001f; @@ -3399,7 +3400,7 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, wet = clamp_def(wet, 0.0f, 1.0f); if (rob_chr) - rob_chr->rob_disp->wet = wet; + rob_chr->disp->wet_cloth = wet; } break; case DSC_X_LIGHT_ROT: { @@ -3434,8 +3435,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_PARTS_DISP: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; ROB_PARTS_KIND rpk = (ROB_PARTS_KIND)data[1]; @@ -3450,8 +3451,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_CHARA_SIZE: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t chara_size = data[1]; @@ -3464,18 +3465,18 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, chara_size_index = rob_data_get_chara_size_index(rob_chr->chara_num); else if (chara_size == 1) { CHARA_NUM chara_num = CN_MIKU; - if (chara_id < pv_game->get_data().play_param->chara.size()) + if (rob_id < pv_game->get_data().play_param->chara.size()) chara_num = (CHARA_NUM)pv_game->get_data() - .play_param->chara[chara_id].chara_effect.base_chara; + .play_param->chara[rob_id].chara_effect.base_chara; else if (pv_game->get_data().pv_id == 826 && false) - chara_num = rob_chara_array_get(chara_id)->chara_num; + chara_num = get_rob_management()->get_rob(rob_id)->chara_num; chara_size_index = rob_data_get_chara_size_index(chara_num); } else if (chara_size == 2) chara_size_index = 1; else if (chara_size == 3) - chara_size_index = rob_chr->pv_data.chara_size_index; + chara_size_index = rob_chr->rob_init.chara_size_index; else { rob_chr->set_chara_size((float_t)chara_size / 1000.0f); break; @@ -3488,8 +3489,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_chara_pos_adjust_y(chara_pos_adjust_y_table_get_value(chara_size_index)); } break; case DSC_X_CHARA_HEIGHT_ADJUST: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; int32_t height_adjust = data[1]; @@ -3501,8 +3502,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, printf_debug(""); } break; case DSC_X_CHARA_POS_ADJUST: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; vec3 pos; @@ -3517,8 +3518,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_chara_pos_adjust(pos); if (rob_chr->check_for_ageageagain_module()) { - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 1); - rob_chara_age_age_array_set_skip(rob_chr->chara_id, 2); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 1); + rob_chara_age_age_array_set_skip(rob_chr->idnm, 2); } } break; case DSC_X_SCENE_ROT: { @@ -3547,8 +3548,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_WIND: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t wind_strength_kami = (float_t)data[1] * 0.001f; @@ -3560,8 +3561,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_wind_strength(wind_strength_outer); } break; case DSC_X_OSAGE_STEP: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t osage_step_kami = (float_t)data[1] * 0.001f; @@ -3573,8 +3574,8 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, rob_chr->set_osage_step(osage_step_outer); } break; case DSC_X_OSAGE_MV_CCL: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t osage_mv_ccl_kami = (float_t)data[1] * 0.001f; @@ -3673,17 +3674,17 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, set_pv_param_post_process_dof_data(enable == 1, id, duration); } break; case DSC_X_CHARA_ALPHA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t alpha = (float_t)data[1] * 0.001f; float_t duration = (float_t)data[2]; int32_t type = data[3]; - if (chara_id >= 0 && chara_id < ROB_ID_MAX) + if (rob_id >= 0 && rob_id < ROB_ID_MAX) pv_param_task::post_process_task_set_chara_alpha( - chara_id, type, alpha, duration); + rob_id, type, alpha, duration); } break; case DSC_X_AUTO_CAPTURE_BEGIN: { @@ -3698,17 +3699,17 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_ITEM_ALPHA: { - chara_id = data[0]; - playdata = &this->playdata[chara_id]; + rob_id = (ROB_ID)data[0]; + playdata = &this->playdata[rob_id]; rob_chr = playdata->rob_chr; float_t alpha = (float_t)data[1] * 0.001f; float_t duration = (float_t)data[2]; int32_t type = data[3]; - if (chara_id >= 0 && chara_id < ROB_ID_MAX) { + if (rob_id >= 0 && rob_id < ROB_ID_MAX) { pv_param_task::post_process_task_set_chara_item_alpha( - chara_id, type, alpha, duration, + rob_id, type, alpha, duration, x_pv_game_item_alpha_callback, this->pv_game); } } break; @@ -3766,10 +3767,10 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_SONG_EFFECT_ATTACH: { int32_t index = data[0]; - int32_t chara_id = data[1]; + ROB_ID rob_id = (ROB_ID)data[1]; int32_t chara_item = data[2]; - pv_game->get_data().effect.set_chara_id(index, chara_id, !!chara_item); + pv_game->get_data().effect.set_chara_id(index, rob_id, !!chara_item); } break; case DSC_X_LIGHT_AUTH: { @@ -3806,20 +3807,20 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_CHARA_EFFECT: { - int32_t chara_id = data[0]; + ROB_ID rob_id = (ROB_ID)data[0]; bool enable = data[1] ? true : false; int32_t index = data[2]; x_pv_game_chara_effect& chara_effect = pv_game->get_data().chara_effect; if (enable) { - chara_effect.set_chara_effect(chara_id, index, dsc_time); + chara_effect.set_chara_effect(rob_id, index, dsc_time); //if (a2->field_18) - // chara_effect.set_chara_effect_time(chara_id, index/*, a2->field_20*/); + // chara_effect.set_chara_effect_time(rob_id, index/*, a2->field_20*/); //else - chara_effect.set_chara_effect_time(chara_id, index, pv_game->time); + chara_effect.set_chara_effect_time(rob_id, index, pv_game->time); } else - chara_effect.stop_chara_effect(chara_id, index); + chara_effect.stop_chara_effect(rob_id, index); } break; case DSC_X_MARKER: { @@ -4020,11 +4021,11 @@ void x_pv_game_pv_data::find_change_fields(std::vector& change_fields) } } -void x_pv_game_pv_data::find_playdata_item_anim(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +void x_pv_game_pv_data::find_playdata_item_anim(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - x_pv_play_data* playdata = &this->playdata[chara_id]; + x_pv_play_data* playdata = &this->playdata[rob_id]; playdata->motion_data.set_item.clear(); int32_t pv_branch_mode = 0; @@ -4045,18 +4046,18 @@ void x_pv_game_pv_data::find_playdata_item_anim(int32_t chara_id) { } int32_t* data = dsc.get_func_data(i); - if (chara_id == data[0] && data[2] == 2) + if (rob_id == data[0] && data[2] == 2) playdata->motion_data.set_item.push_back({ time, data[1], pv_branch_mode }); prev_time = time; i++; } } -void x_pv_game_pv_data::find_playdata_set_motion(int32_t chara_id) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX) +void x_pv_game_pv_data::find_playdata_set_motion(ROB_ID rob_id) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX) return; - x_pv_play_data* playdata = &this->playdata[chara_id]; + x_pv_play_data* playdata = &this->playdata[rob_id]; playdata->motion_data.set_motion.clear(); int32_t pv_branch_mode = 0; @@ -4077,7 +4078,7 @@ void x_pv_game_pv_data::find_playdata_set_motion(int32_t chara_id) { } int32_t* data = dsc.get_func_data(i); - if (chara_id == data[0]) + if (rob_id == data[0]) playdata->motion_data.set_motion.push_back({ time, data[1], pv_branch_mode }); prev_time = time; i++; @@ -4123,10 +4124,10 @@ void x_pv_game_pv_data::find_set_motion() { int32_t* data = dsc.get_func_data(i); - int32_t chara_id = data[0]; + ROB_ID rob_id = (ROB_ID)data[0]; int32_t motion_index = data[1]; - v98[chara_id].push_back({ time, motion_index, pv_branch_mode }); + v98[rob_id].push_back({ time, motion_index, pv_branch_mode }); prev_time = time; i++; @@ -4179,7 +4180,7 @@ void x_pv_game_pv_data::find_set_motion() { float_t frame = prj::roundf(dsc_time_to_frame(((int64_t)j.time - time) * 10000)); - uint32_t motion_id = -1; + uint32_t motnum = -1; if (i >= 0 && i < play_param->chara.size()) { pvpp_chara& chara = play_param->chara[i]; if (j.index > 0 && j.index <= chara.motion.size()) { @@ -4189,12 +4190,12 @@ void x_pv_game_pv_data::find_set_motion() { size_t pos = name.find("PV832"); if (pos != -1) name.replace(pos, 5, "PV800", 5); - motion_id = aft_mot_db->get_motion_id(name.c_str()); + motnum = aft_mot_db->get_motion_id(name.c_str()); } } - if (motion_id != -1) - set_motion.push_back({ motion_id, { frame, -1 } }); + if (motnum != -1) + set_motion.push_back({ motnum, { frame, -1 } }); } } @@ -4202,7 +4203,7 @@ void x_pv_game_pv_data::find_set_motion() { if (i < 0 || i >= play_param->chara.size()) continue; - rob_chara* rob_chr = rob_chara_array_get(i); + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); int32_t pv_id = pv_game->get_data().pv_id; std::vector& set_motion = this->set_motion[i]; @@ -4212,7 +4213,7 @@ void x_pv_game_pv_data::find_set_motion() { osage_init_data osage_init; osage_init.rob_chr = rob_chr; osage_init.pv_id = pv_id; - osage_init.motion_id = j.motion_id; + osage_init.motnum = j.motnum; osage_init.frame = (int32_t)j.frame_stage_index.first; vec.push_back(osage_init); } @@ -4256,24 +4257,24 @@ void x_pv_game_pv_data::init(class x_pv_game* pv_game, bool music_play) { pv_expression_array_reset(); for (int32_t i = 0; i < ROB_ID_MAX; i++) { - if (pv_game->rob_chara_ids[i] == -1) + if (pv_game->rob_ids[i] == ROB_ID_NULL) continue; x_pv_play_data& playdata = this->playdata[i]; playdata.reset(); playdata.set_motion.clear(); - if (pv_game->rob_chara_ids[i] != -1) - playdata.rob_chr = rob_chara_array_get(pv_game->rob_chara_ids[i]); + if (pv_game->rob_ids[i] != ROB_ID_NULL) + playdata.rob_chr = get_rob_management()->get_rob(pv_game->rob_ids[i]); if (playdata.rob_chr) { playdata.rob_chr->frame_speed = anim_frame_speed; - playdata.rob_chr->data.motion.step_data.step = anim_frame_speed; + playdata.rob_chr->rob_base.robmot.step.req_f = anim_frame_speed; pv_expression_array_set(i, playdata.rob_chr, anim_frame_speed); } - find_playdata_set_motion(i); - find_playdata_item_anim(i); + find_playdata_set_motion((ROB_ID)i); + find_playdata_item_anim((ROB_ID)i); } find_set_motion(); @@ -4292,7 +4293,7 @@ void x_pv_game_pv_data::init(class x_pv_game* pv_game, bool music_play) { shad->blur_filter_enable[1] = true; } - chara_id = 0; + rob_id = ROB_ID_1P; } void x_pv_game_pv_data::reset() { @@ -4333,11 +4334,11 @@ bool x_pv_game_pv_data::set_pv_param_post_process_dof_data(bool set, int32_t id, return true; } -void x_pv_game_pv_data::set_motion_max_frame(int32_t chara_id, int32_t motion_index, int64_t time) { - if (chara_id < 0 || chara_id >= ROB_ID_MAX || motion_index < 0) +void x_pv_game_pv_data::set_motion_max_frame(ROB_ID rob_id, int32_t motion_index, int64_t time) { + if (rob_id < 0 || rob_id >= ROB_ID_MAX || motion_index < 0) return; - x_pv_play_data& playdata = this->playdata[chara_id]; + x_pv_play_data& playdata = this->playdata[rob_id]; std::vector& set_motion = playdata.motion_data.set_motion; for (x_pv_play_data_event& i : set_motion) @@ -6110,8 +6111,11 @@ void x_pv_game_stage::unload() { state = 30; } -x_pv_game::x_pv_game() : state(), pv_count(), pv_index(), state_old(), frame(), frame_float(), time(), -rob_chara_ids(), success(), task_effect_init(), pause(), step_frame(), pv_id(), stage_id(), charas(), modules() { +x_pv_game::x_pv_game() : state(), pv_count(), pv_index(), state_old(), +frame(), frame_float(), time(), rob_ids(), success(), task_effect_init(), +pause(), step_frame(), pv_id(), stage_id(), charas(), modules() { + for (ROB_ID& i : rob_ids) + i = ROB_ID_NULL; light_auth_3d_id = {}; for (CHARA_NUM& i : charas) i = CN_MAX; @@ -6456,7 +6460,7 @@ bool x_pv_game::ctrl() { #if BAKE_PV826 if (pv_data.pv_id == 826) - effchrpv_auth_3d_to_mot_init(pv_data.pv_id, rob_chara_ids); + effchrpv_auth_3d_to_mot_init(pv_data.pv_id, rob_ids); #endif pv_data.load(pv_data.pv_id, &field_71994, charas); @@ -6468,15 +6472,19 @@ bool x_pv_game::ctrl() { int32_t chara = 0; for (pvpp_chara& i : pv_data.play_param->chara) { - if (i.motion.size() && rob_chara_ids[chara] == -1) { - rob_chara_pv_data pv_data; - pv_data.chara_size_index = rob_data_get_chara_size_index(charas[chara]); + if (i.motion.size() && rob_ids[chara] == ROB_ID_NULL) { + RobInit rob_init; + rob_init.chara_size_index = rob_data_get_chara_size_index(charas[chara]); rob_sleeve_handler_data_get_sleeve_data( - charas[chara], modules[chara], pv_data.sleeve_l, pv_data.sleeve_r); - int32_t chara_id = rob_chara_array_init_chara_num( - charas[chara], pv_data, modules[chara], true); - if (chara_id >= 0 && chara_id < ROB_ID_MAX) - rob_chara_ids[chara] = chara_id; + charas[chara], modules[chara], rob_init.sleeve_l, rob_init.sleeve_r); + + RobManagement* rob_mon = get_rob_management(); + if (rob_mon) { + ROB_ID rob_id = rob_mon->create_rob( + charas[chara], rob_init, modules[chara], true); + if (rob_id >= 0 && rob_id < ROB_ID_MAX) + rob_ids[chara] = rob_id; + } } if (++chara >= ROB_ID_MAX) @@ -6499,8 +6507,8 @@ bool x_pv_game::ctrl() { case 3: { bool wait_load = false; for (int32_t i = 0; i < ROB_ID_MAX; i++) - if (rob_chara_ids[i] != -1) - wait_load |= !task_rob_manager_check_chara_loaded(rob_chara_ids[i]); + if (rob_ids[i] != ROB_ID_NULL) + wait_load |= !task_rob_manager_check_chara_loaded(rob_ids[i]); if (wait_load) break; @@ -6946,28 +6954,28 @@ bool x_pv_game::ctrl() { switch (i.func) { case DSC_X_TIME: { for (miku_state& i : state) - if (state[get_data().pv_data.chara_id].disp + if (state[get_data().pv_data.rob_id].disp && i.disp_time == time && i.set_motion_time != time) state_vec.push_back(i); time = data[0]; frame = (int32_t)prj::roundf((float_t)time * (float_t)(60.0 / 100000.0)); } break; case DSC_X_MIKU_DISP: { - int32_t chara_id = data[0]; - state[chara_id].disp = data[1] == 1; - if (state[chara_id].disp) - state[chara_id].disp_time = time; + ROB_ID rob_id = (ROB_ID)data[0]; + state[rob_id].disp = data[1] == 1; + if (state[rob_id].disp) + state[rob_id].disp_time = time; miku_disp.push_back(time, i.data_offset); - if (!hand_anim_set[chara_id]) { - hand_anim_set_time[chara_id] = time; - hand_anim_set[chara_id] = true; + if (!hand_anim_set[rob_id]) { + hand_anim_set_time[rob_id] = time; + hand_anim_set[rob_id] = true; } } break; case DSC_X_SET_MOTION: { - int32_t chara_id = data[0]; - state[chara_id].set_motion_time = time; - state[chara_id].set_motion_data_offset = i.data_offset; + ROB_ID rob_id = (ROB_ID)data[0]; + state[rob_id].set_motion_time = time; + state[rob_id].set_motion_data_offset = i.data_offset; set_motion.push_back(time, i.data_offset); } break; case DSC_X_SET_PLAYDATA: { @@ -7118,21 +7126,21 @@ bool x_pv_game::ctrl() { for (int32_t i = 0; i < ROB_ID_MAX; i++) { #if BAKE_X_PACK - if (pv_x_bake || rob_chara_ids[i] == -1) + if (pv_x_bake || rob_ids[i] == ROB_ID_NULL) continue; #else - if (rob_chara_ids[i] == -1) + if (rob_ids[i] == ROB_ID_NULL) continue; #endif - int32_t chara_id = rob_chara_ids[i]; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + ROB_ID rob_id = rob_ids[i]; + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (!rob_chr) continue; - pv_osage_manager_array_reset(chara_id); - pv_osage_manager_array_set_pv_set_motion(chara_id, get_data().pv_data.set_motion[chara_id]); - pv_osage_manager_array_set_pv_id(chara_id, get_data().pv_id == 832 ? 800 : get_data().pv_id, true); + pv_osage_manager_array_reset(rob_id); + pv_osage_manager_array_set_pv_set_motion(rob_id, get_data().pv_data.set_motion[rob_id]); + pv_osage_manager_array_set_pv_id(rob_id, get_data().pv_id == 832 ? 800 : get_data().pv_id, true); } state = 10; @@ -8199,8 +8207,8 @@ void x_pv_game::load(int32_t pv_id, int32_t stage_id, CHARA_NUM charas[6], int32 pause = false; step_frame = false; - for (int32_t& i : rob_chara_ids) - i = -1; + for (ROB_ID& i : rob_ids) + i = ROB_ID_NULL; state = 10; state_old = 1; @@ -8233,7 +8241,7 @@ bool x_pv_game::unload() { } #endif - for (int32_t& i : rob_chara_ids) + for (ROB_ID& i : rob_ids) skin_param_manager_reset(i); data_struct* aft_data = &data_list[DATA_AFT]; @@ -8253,10 +8261,12 @@ bool x_pv_game::unload() { frame_float = 0.0; time = 0; - for (int32_t& i : rob_chara_ids) - if (i != -1) { - rob_chara_array_free_chara_id(i); - i = -1; + for (ROB_ID& i : rob_ids) + if (i != ROB_ID_NULL) { + RobManagement* rob_mon = get_rob_management(); + if (rob_mon) + rob_mon->dest_rob(i); + i = ROB_ID_NULL; } light_auth_3d_id.unload(rctx_ptr); @@ -10028,16 +10038,16 @@ static float_t dsc_time_to_frame(int64_t time) { return (float_t)time / 1000000000.0f * 60.0f; } -static vec3 x_pv_game_dof_callback(void* data, int32_t chara_id) { +static vec3 x_pv_game_dof_callback(void* data, ROB_ID rob_id) { x_pv_game_data& pv_data = ((x_pv_game*)data)->get_data(); - if (chara_id >= pv_data.play_param->chara.size()) - return pv_data.chara_effect.get_node_translation(0, - (int32_t)(chara_id - pv_data.play_param->chara.size()), 0, "j_kao_wj"); + if (rob_id >= pv_data.play_param->chara.size()) + return pv_data.chara_effect.get_node_translation(ROB_ID_1P, + (int32_t)(rob_id - pv_data.play_param->chara.size()), 0, "j_kao_wj"); - if (chara_id < 0 && chara_id >= ROB_ID_MAX) + if (rob_id < 0 && rob_id >= ROB_ID_MAX) return 0.0f; - rob_chara* rob_chr = rob_chara_array_get(chara_id); + rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (!rob_chr) return 0.0f; @@ -10046,13 +10056,13 @@ static vec3 x_pv_game_dof_callback(void* data, int32_t chara_id) { return trans; } -static void x_pv_game_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha) { +static void x_pv_game_item_alpha_callback(void* data, ROB_ID rob_id, int32_t type, float_t alpha) { if (!data) return; x_pv_game_data& pv_data = ((x_pv_game*)data)->get_data(); - if (chara_id < 0 || chara_id >= pv_data.play_param->chara.size()) + if (rob_id < 0 || rob_id >= pv_data.play_param->chara.size()) return; mdl::ObjFlags flags; @@ -10070,7 +10080,7 @@ static void x_pv_game_item_alpha_callback(void* data, int32_t chara_id, int32_t } for (x_pv_game_song_effect& i : pv_data.effect.song_effect) { - if (i.chara_id != chara_id) + if (i.rob_id != rob_id) continue; for (x_pv_game_song_effect_auth_3d& j : i.auth_3d) diff --git a/src/ReDIVA/x_pv_game.hpp b/src/ReDIVA/x_pv_game.hpp index 5ddac084..92723719 100644 --- a/src/ReDIVA/x_pv_game.hpp +++ b/src/ReDIVA/x_pv_game.hpp @@ -107,7 +107,7 @@ public: struct x_pv_play_data_set_motion { float_t frame_speed; - uint32_t motion_id; + uint32_t motnum; float_t frame; float_t blend_duration; bool blend; @@ -185,7 +185,7 @@ struct x_pv_game_song_effect_glitter { struct x_pv_game_song_effect { bool enable; - int32_t chara_id; + ROB_ID rob_id; int64_t time; std::vector auth_3d; std::vector glitter; @@ -233,7 +233,7 @@ struct x_pv_game_effect { void load(int32_t pv_id, pvpp* play_param, FrameRateControl* frame_rate_control); void load_data(int32_t pv_id, object_database* obj_db, texture_database* tex_db); void reset(); - void set_chara_id(int32_t index, int32_t chara_id, bool chara_scale); + void set_chara_id(int32_t index, ROB_ID rob_id, bool chara_scale); void set_song_effect(int32_t index, int64_t time); void set_song_effect_time(int32_t index, int64_t time, bool glitter); void set_song_effect_time_inner(int32_t index, int64_t time, bool glitter); @@ -274,15 +274,15 @@ struct x_pv_game_chara_effect { ~x_pv_game_chara_effect(); void ctrl(int32_t pv_id, object_database* obj_db, texture_database* tex_db); - vec3 get_node_translation(int32_t chara_id, int32_t chara_effect, int32_t objhrc_index, const char* node_name); + vec3 get_node_translation(ROB_ID rob_id, int32_t chara_effect, int32_t objhrc_index, const char* node_name); void load(int32_t pv_id, pvpp* play_param, FrameRateControl* frame_rate_control, CHARA_NUM charas[6]); void load_data(); void reset(); - void set_chara_effect(int32_t chara_id, int32_t index, int64_t time); - void set_chara_effect_time(int32_t chara_id, int32_t index, int64_t time); + void set_chara_effect(ROB_ID rob_id, int32_t index, int64_t time); + void set_chara_effect_time(ROB_ID rob_id, int32_t index, int64_t time); void set_time(int64_t time); void stop(); - void stop_chara_effect(int32_t chara_id, int32_t index); + void stop_chara_effect(ROB_ID rob_id, int32_t index); void unload(); void unload_data(); }; @@ -479,7 +479,7 @@ struct x_pv_game_pv_data { dsc_data* dsc_data_ptr; dsc_data* dsc_data_ptr_end; std::vector set_motion[ROB_ID_MAX]; - int32_t chara_id; + ROB_ID rob_id; class x_pv_game* pv_game; float_t measured_fps; float_t anim_frame_speed; @@ -500,8 +500,8 @@ struct x_pv_game_pv_data { int32_t* pv_branch_mode, dsc_data* start, dsc_data* end); void find_bar_beat(x_pv_bar_beat& bar_beat); void find_change_fields(std::vector& change_fields); - void find_playdata_item_anim(int32_t chara_id); - void find_playdata_set_motion(int32_t chara_id); + void find_playdata_item_anim(ROB_ID rob_id); + void find_playdata_set_motion(ROB_ID rob_id); int64_t find_pv_end(); void find_set_motion(); void find_stage_effects(prj::vector_pair& stage_effects); @@ -510,7 +510,7 @@ struct x_pv_game_pv_data { bool set_pv_param_post_process_bloom_data(bool set, int32_t id, float_t duration); bool set_pv_param_post_process_color_correction_data(bool set, int32_t id, float_t duration); bool set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration); - void set_motion_max_frame(int32_t chara_id, int32_t motion_index, int64_t time); + void set_motion_max_frame(ROB_ID rob_id, int32_t motion_index, int64_t time); void stop(); void unload(); void unload_data(); @@ -756,7 +756,7 @@ public: int32_t frame; double_t frame_float; int64_t time; - int32_t rob_chara_ids[ROB_ID_MAX]; + ROB_ID rob_ids[ROB_ID_MAX]; std::string light_category;