Files
korenkonder_ReDIVA/src/KKdLib/dsc.cpp
T

2998 lines
101 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#include "dsc.hpp"
#include "f2/struct.hpp"
#include "hash.hpp"
#include "sort.hpp"
#include "str_utils.h"
static const dsc_func dsc_ac101_func[] = {
{ 0, 0, "END" },
{ 1, 1, "TIME" },
{ 2, 3, "MIKU_MOVE" },
{ 3, 1, "MIKU_ROT" },
{ 4, 1, "MIKU_DISP" },
{ 5, 1, "MIKU_SHADOW" },
{ 6, 7, "TARGET" },
{ 7, 3, "SET_MOTION" },
{ 8, 1, "SET_PLAYDATA" },
{ 9, 5, "EFFECT" },
{ 10, 2, "FADEIN_FIELD" },
{ 11, 1, "EFFECT_OFF" },
{ 12, 6, "SET_CAMERA" },
{ 13, 2, "DATA_CAMERA" },
{ 14, 1, "CHANGE_FIELD" },
{ 15, 1, "HIDE_FIELD" },
{ 16, 3, "MOVE_FIELD" },
{ 17, 2, "FADEOUT_FIELD" },
{ 18, 2, "EYE_ANIM" },
{ 19, 3, "MOUTH_ANIM" },
{ 20, 4, "HAND_ANIM" },
{ 21, 3, "LOOK_ANIM" },
{ 22, 3, "EXPRESSION" },
{ 23, 4, "LOOK_CAMERA" },
{ 24, 1, "LYRIC" },
{ 25, 0, "MUSIC_PLAY" },
{ 26, 1, "MODE_SELECT" },
{ 27, 2, "EDIT_MOTION" },
{ 28, 2, "BAR_TIME_SET" },
{ 29, 1, "SHADOWHEIGHT" },
{ 30, 2, "EDIT_FACE" },
{ 31, 19, "MOVE_CAMERA" },
{ 32, 0, "PV_END" },
{ 33, 2, "SHADOWPOS" },
{ 34, 2, "NEAR_CLIP" },
{ 35, 1, "CLOTH_WET" },
{ 36, 6, "SCENE_FADE" }, // AC110
{ 37, 6, "TONE_TRANS" }, // AC120
{ 38, 1, "SATURATE" },
{ 39, 1, "FADE_MODE" },
};
static const dsc_func_ac dsc_ac_func[] = {
{ 0, 0, 0, "END" },
{ 1, 1, 1, "TIME" },
{ 2, 3, 4, "MIKU_MOVE" },
{ 3, 1, 2, "MIKU_ROT" },
{ 4, 1, 2, "MIKU_DISP" },
{ 5, 1, 2, "MIKU_SHADOW" },
{ 6, 7, 7, "TARGET" },
{ 7, 3, 4, "SET_MOTION" },
{ 8, 1, 2, "SET_PLAYDATA" },
{ 9, 5, 6, "EFFECT" },
{ 10, 2, 2, "FADEIN_FIELD" },
{ 11, 1, 1, "EFFECT_OFF" },
{ 12, 6, 6, "SET_CAMERA" },
{ 13, 2, 2, "DATA_CAMERA" },
{ 14, 1, 1, "CHANGE_FIELD" },
{ 15, 1, 1, "HIDE_FIELD" },
{ 16, 3, 3, "MOVE_FIELD" },
{ 17, 2, 2, "FADEOUT_FIELD" },
{ 18, 2, 3, "EYE_ANIM" },
{ 19, 3, 5, "MOUTH_ANIM" },
{ 20, 4, 5, "HAND_ANIM" },
{ 21, 3, 4, "LOOK_ANIM" },
{ 22, 3, 4, "EXPRESSION" },
{ 23, 4, 5, "LOOK_CAMERA" },
{ 24, 1, 2, "LYRIC" },
{ 25, 0, 0, "MUSIC_PLAY" },
{ 26, 1, 2, "MODE_SELECT" },
{ 27, 2, 4, "EDIT_MOTION" },
{ 28, 2, 2, "BAR_TIME_SET" },
{ 29, 1, 2, "SHADOWHEIGHT" },
{ 30, 2, 1, "EDIT_FACE" },
{ 31, 19, 21, "MOVE_CAMERA" },
{ 32, 0, 0, "PV_END" },
{ 33, 2, 3, "SHADOWPOS" },
{ 34, 2, 2, "EDIT_LYRIC" },
{ 35, 5, 5, "EDIT_TARGET" },
{ 36, 1, 1, "EDIT_MOUTH" },
{ 37, 1, 1, "SET_CHARA" },
{ 38, 7, 7, "EDIT_MOVE" },
{ 39, 1, 1, "EDIT_SHADOW" },
{ 40, 1, 1, "EDIT_EYELID" },
{ 41, 2, 2, "EDIT_EYE" },
{ 42, 1, 1, "EDIT_ITEM" },
{ 43, 2, 2, "EDIT_EFFECT" },
{ 44, 1, 1, "EDIT_DISP" },
{ 45, 2, 2, "EDIT_HAND_ANIM" },
{ 46, 3, 3, "AIM" },
{ 47, 3, 3, "HAND_ITEM" },
{ 48, 1, 1, "EDIT_BLUSH" },
{ 49, 2, 2, "NEAR_CLIP" },
{ 50, 1, 2, "CLOTH_WET" },
{ 51, 3, 3, "LIGHT_ROT" },
{ 52, 6, 6, "SCENE_FADE" },
{ 53, 6, 6, "TONE_TRANS" },
{ 54, 1, 1, "SATURATE" },
{ 55, 1, 1, "FADE_MODE" },
{ 56, 2, 2, "AUTO_BLINK" },
{ 57, 3, 3, "PARTS_DISP" },
{ 58, 1, 1, "TARGET_FLYING_TIME" }, // AC210
{ 59, 2, 2, "CHARA_SIZE" },
{ 60, 2, 2, "CHARA_HEIGHT_ADJUST" },
{ 61, 4, 4, "ITEM_ANIM" },
{ 62, 4, 4, "CHARA_POS_ADJUST" },
{ 63, 1, 1, "SCENE_ROT" },
{ 64, 2, 2, "EDIT_MOT_SMOOTH_LEN" }, // AC500
{ 65, 1, 1, "PV_BRANCH_MODE" }, // AC510
{ 66, 2, 2, "DATA_CAMERA_START" },
{ 67, 1, 1, "MOVIE_PLAY" },
{ 68, 1, 1, "MOVIE_DISP" },
{ 69, 3, 3, "WIND" },
{ 70, 3, 3, "OSAGE_STEP" },
{ 71, 3, 3, "OSAGE_MV_CCL" },
{ 72, 2, 2, "CHARA_COLOR" },
{ 73, 1, 1, "SE_EFFECT" },
{ 74, 9, 9, "EDIT_MOVE_XYZ" },
{ 75, 3, 3, "EDIT_EYELID_ANIM" },
{ 76, 2, 2, "EDIT_INSTRUMENT_ITEM" },
{ 77, 4, 4, "EDIT_MOTION_LOOP" },
{ 78, 2, 2, "EDIT_EXPRESSION" },
{ 79, 3, 3, "EDIT_EYE_ANIM" },
{ 80, 2, 2, "EDIT_MOUTH_ANIM" },
{ 81, 24, 24, "EDIT_CAMERA" },
{ 82, 1, 1, "EDIT_MODE_SELECT" },
{ 83, 2, 2, "PV_END_FADEOUT" },
{ 84, 1, 1, "TARGET_FLAG" },
{ 85, 3, 3, "ITEM_ANIM_ATTACH" },
{ 86, 1, 1, "SHADOW_RANGE" },
{ 87, 3, 3, "HAND_SCALE" }, // AFT101
{ 88, 4, 4, "LIGHT_POS" },
{ 89, 1, 1, "FACE_TYPE" }, // AFT200
{ 90, 2, 2, "SHADOW_CAST" }, // AFT300
{ 91, 6, 6, "EDIT_MOTION_F" }, // AFT310
{ 92, 3, 3, "FOG" }, // AFT410
{ 93, 2, 2, "BLOOM" },
{ 94, 3, 3, "COLOR_COLLE" },
{ 95, 3, 3, "DOF" },
{ 96, 4, 4, "CHARA_ALPHA" },
{ 97, 1, 1, "AOTO_CAP" },
{ 98, 1, 1, "MAN_CAP" },
{ 99, 3, 3, "TOON" },
{ 100, 3, 3, "SHIMMER" },
{ 101, 4, 4, "ITEM_ALPHA" },
{ 102, 1, 1, "MOVIE_CUT_CHG" },
{ 103, 3, 3, "CHARA_LIGHT" },
{ 104, 3, 3, "STAGE_LIGHT" },
{ 105, 8, 8, "AGEAGE_CTR" }, // AFT701
{ 106, 2, 2, "PSE" }, // FT
};
static const dsc_func_ac dsc_f_func[] = {
{ 0, 0, 0, "END" },
{ 1, 1, 1, "TIME" },
{ 2, 3, 4, "MIKU_MOVE" },
{ 3, 1, 2, "MIKU_ROT" },
{ 4, 1, 2, "MIKU_DISP" },
{ 5, 1, 2, "MIKU_SHADOW" },
{ 6, 7, 11, "TARGET" },
{ 7, 3, 4, "SET_MOTION" },
{ 8, 1, 2, "SET_PLAYDATA" },
{ 9, 5, 6, "EFFECT" },
{ 10, 2, 2, "FADEIN_FIELD" },
{ 11, 1, 1, "EFFECT_OFF" },
{ 12, 6, 6, "SET_CAMERA" },
{ 13, 2, 2, "DATA_CAMERA" },
{ 14, 1, 1, "CHANGE_FIELD" },
{ 15, 1, 1, "HIDE_FIELD" },
{ 16, 3, 3, "MOVE_FIELD" },
{ 17, 2, 2, "FADEOUT_FIELD" },
{ 18, 2, 3, "EYE_ANIM" },
{ 19, 3, 5, "MOUTH_ANIM" },
{ 20, 4, 5, "HAND_ANIM" },
{ 21, 3, 4, "LOOK_ANIM" },
{ 22, 3, 4, "EXPRESSION" },
{ 23, 4, 5, "LOOK_CAMERA" },
{ 24, 1, 2, "LYRIC" },
{ 25, 0, 0, "MUSIC_PLAY" },
{ 26, 1, 2, "MODE_SELECT" },
{ 27, 2, 4, "EDIT_MOTION" },
{ 28, 2, 2, "BAR_TIME_SET" },
{ 29, 1, 2, "SHADOWHEIGHT" },
{ 30, 2, 1, "EDIT_FACE" },
{ 31, 19, 21, "MOVE_CAMERA" },
{ 32, 0, 0, "PV_END" },
{ 33, 2, 3, "SHADOWPOS" },
{ 34, 2, 2, "EDIT_LYRIC" },
{ 35, 5, 5, "EDIT_TARGET" },
{ 36, 1, 1, "EDIT_MOUTH" },
{ 37, 1, 1, "SET_CHARA" },
{ 38, 7, 7, "EDIT_MOVE" },
{ 39, 1, 1, "EDIT_SHADOW" },
{ 40, 1, 1, "EDIT_EYELID" },
{ 41, 2, 2, "EDIT_EYE" },
{ 42, 1, 1, "EDIT_ITEM" },
{ 43, 2, 2, "EDIT_EFFECT" },
{ 44, 1, 1, "EDIT_DISP" },
{ 45, 2, 2, "EDIT_HAND_ANIM" },
{ 46, 3, 3, "AIM" },
{ 47, 3, 3, "HAND_ITEM" },
{ 48, 1, 1, "EDIT_BLUSH" },
{ 49, 2, 2, "NEAR_CLIP" }, // DT 2nd
{ 50, 1, 2, "CLOTH_WET" },
{ 51, 3, 3, "LIGHT_ROT" },
{ 52, 6, 6, "SCENE_FADE" },
{ 53, 6, 6, "TONE_TRANS" },
{ 54, 1, 1, "SATURATE" },
{ 55, 1, 1, "FADE_MODE" },
{ 56, 2, 2, "AUTO_BLINK" },
{ 57, 3, 3, "PARTS_DISP" },
{ 58, 1, 1, "TARGET_FLYING_TIME" },
{ 59, 2, 2, "CHARA_SIZE" },
{ 60, 2, 2, "CHARA_HEIGHT_ADJUST" },
{ 61, 4, 4, "ITEM_ANIM" },
{ 62, 4, 4, "CHARA_POS_ADJUST" },
{ 63, 1, 1, "SCENE_ROT" },
{ 64, 2, 2, "EDIT_MOT_SMOOTH_LEN" }, // F
{ 65, 1, 1, "PV_BRANCH_MODE" },
{ 66, 2, 2, "DATA_CAMERA_START" },
{ 67, 1, 1, "MOVIE_PLAY" },
{ 68, 1, 1, "MOVIE_DISP" },
{ 69, 3, 3, "WIND" },
{ 70, 3, 3, "OSAGE_STEP" },
{ 71, 3, 3, "OSAGE_MV_CCL" },
{ 72, 2, 2, "CHARA_COLOR" },
{ 73, 1, 1, "SE_EFFECT" },
{ 74, 9, 9, "EDIT_MOVE_XYZ" },
{ 75, 3, 3, "EDIT_EYELID_ANIM" },
{ 76, 2, 2, "EDIT_INSTRUMENT_ITEM" },
{ 77, 4, 4, "EDIT_MOTION_LOOP" },
{ 78, 2, 2, "EDIT_EXPRESSION" },
{ 79, 3, 3, "EDIT_EYE_ANIM" },
{ 80, 2, 2, "EDIT_MOUTH_ANIM" },
{ 81, 24, 24, "EDIT_CAMERA" },
{ 82, 1, 1, "EDIT_MODE_SELECT" },
{ 83, 2, 2, "PV_END_FADEOUT" },
};
static const dsc_func dsc_f2_func[] = {
{ 0, 0, "END" },
{ 1, 1, "TIME" },
{ 2, 4, "MIKU_MOVE" },
{ 3, 2, "MIKU_ROT" },
{ 4, 2, "MIKU_DISP" },
{ 5, 2, "MIKU_SHADOW" },
{ 6, 12, "TARGET" },
{ 7, 4, "SET_MOTION" },
{ 8, 2, "SET_PLAYDATA" },
{ 9, 6, "EFFECT" },
{ 10, 2, "FADEIN_FIELD" },
{ 11, 1, "EFFECT_OFF" },
{ 12, 6, "SET_CAMERA" },
{ 13, 2, "DATA_CAMERA" },
{ 14, 2, "CHANGE_FIELD" },
{ 15, 1, "HIDE_FIELD" },
{ 16, 3, "MOVE_FIELD" },
{ 17, 2, "FADEOUT_FIELD" },
{ 18, 3, "EYE_ANIM" },
{ 19, 5, "MOUTH_ANIM" },
{ 20, 5, "HAND_ANIM" },
{ 21, 4, "LOOK_ANIM" },
{ 22, 4, "EXPRESSION" },
{ 23, 5, "LOOK_CAMERA" },
{ 24, 2, "LYRIC" },
{ 25, 0, "MUSIC_PLAY" },
{ 26, 2, "MODE_SELECT" },
{ 27, 4, "EDIT_MOTION" },
{ 28, 2, "BAR_TIME_SET" },
{ 29, 2, "SHADOWHEIGHT" },
{ 30, 1, "EDIT_FACE" },
{ 31, 21, "MOVE_CAMERA" },
{ 32, 0, "PV_END" },
{ 33, 3, "SHADOWPOS" },
{ 34, 2, "EDIT_LYRIC" },
{ 35, 5, "EDIT_TARGET" },
{ 36, 1, "EDIT_MOUTH" },
{ 37, 1, "SET_CHARA" },
{ 38, 7, "EDIT_MOVE" },
{ 39, 1, "EDIT_SHADOW" },
{ 40, 1, "EDIT_EYELID" },
{ 41, 2, "EDIT_EYE" },
{ 42, 1, "EDIT_ITEM" },
{ 43, 2, "EDIT_EFFECT" },
{ 44, 1, "EDIT_DISP" },
{ 45, 2, "EDIT_HAND_ANIM" },
{ 46, 3, "AIM" },
{ 47, 3, "HAND_ITEM" },
{ 48, 1, "EDIT_BLUSH" },
{ 49, 2, "NEAR_CLIP" },
{ 50, 2, "CLOTH_WET" },
{ 51, 3, "LIGHT_ROT" },
{ 52, 6, "SCENE_FADE" },
{ 53, 6, "TONE_TRANS" },
{ 54, 1, "SATURATE" },
{ 55, 1, "FADE_MODE" },
{ 56, 2, "AUTO_BLINK" },
{ 57, 3, "PARTS_DISP" },
{ 58, 1, "TARGET_FLYING_TIME" },
{ 59, 2, "CHARA_SIZE" },
{ 60, 2, "CHARA_HEIGHT_ADJUST" },
{ 61, 4, "ITEM_ANIM" },
{ 62, 4, "CHARA_POS_ADJUST" },
{ 63, 1, "SCENE_ROT" },
{ 64, 2, "EDIT_MOT_SMOOTH_LEN" },
{ 65, 1, "PV_BRANCH_MODE" },
{ 66, 2, "DATA_CAMERA_START" },
{ 67, 1, "MOVIE_PLAY" },
{ 68, 1, "MOVIE_DISP" },
{ 69, 3, "WIND" },
{ 70, 3, "OSAGE_STEP" },
{ 71, 3, "OSAGE_MV_CCL" },
{ 72, 2, "CHARA_COLOR" },
{ 73, 1, "SE_EFFECT" },
{ 74, 9, "EDIT_MOVE_XYZ" },
{ 75, 3, "EDIT_EYELID_ANIM" },
{ 76, 2, "EDIT_INSTRUMENT_ITEM" },
{ 77, 4, "EDIT_MOTION_LOOP" },
{ 78, 2, "EDIT_EXPRESSION" },
{ 79, 3, "EDIT_EYE_ANIM" },
{ 80, 2, "EDIT_MOUTH_ANIM" },
{ 81, 22, "EDIT_CAMERA" },
{ 82, 1, "EDIT_MODE_SELECT" },
{ 83, 2, "PV_END_FADEOUT" },
{ 84, 1, "RESERVE" },
{ 85, 6, "RESERVE" },
{ 86, 1, "RESERVE" },
{ 87, 9, "RESERVE" },
{ 88, 2, "PV_AUTH_LIGHT_PRIORITY" },
{ 89, 3, "PV_CHARA_LIGHT" },
{ 90, 3, "PV_STAGE_LIGHT" },
{ 91, 11, "TARGET_EFFECT" },
{ 92, 3, "FOG" },
{ 93, 2, "BLOOM" },
{ 94, 3, "COLOR_CORRECTION" },
{ 95, 3, "DOF" },
{ 96, 4, "CHARA_ALPHA" },
{ 97, 1, "AUTO_CAPTURE_BEGIN" },
{ 98, 1, "MANUAL_CAPTURE" },
{ 99, 3, "TOON_EDGE" },
{ 100, 3, "SHIMMER" },
{ 101, 4, "ITEM_ALPHA" },
{ 102, 1, "MOVIE_CUT" },
{ 103, 112, "EDIT_CAMERA_BOX" },
{ 104, 1, "EDIT_STAGE_PARAM" },
{ 105, 1, "EDIT_CHANGE_FIELD" },
{ 106, 7, "MIKUDAYO_ADJUST" },
{ 107, 2, "LYRIC_2" }, // US/EU
{ 108, 2, "LYRIC_READ" },
{ 109, 2, "LYRIC_READ_2" },
{ 110, 5, "ANNOTATION" },
};
static const dsc_func dsc_mgf_func[] = {
{ 0, 0, "END" },
{ 1, 1, "TIME" },
{ 2, 4, "MIKU_MOVE" },
{ 3, 2, "MIKU_ROT" },
{ 4, 2, "MIKU_DISP" },
{ 5, 2, "MIKU_SHADOW" },
{ 6, 12, "TARGET" },
{ 7, 4, "SET_MOTION" },
{ 8, 2, "SET_PLAYDATA" },
{ 9, 6, "EFFECT" },
{ 10, 2, "FADEIN_FIELD" },
{ 11, 1, "EFFECT_OFF" },
{ 12, 6, "SET_CAMERA" },
{ 13, 2, "DATA_CAMERA" },
{ 14, 2, "CHANGE_FIELD" },
{ 15, 1, "HIDE_FIELD" },
{ 16, 3, "MOVE_FIELD" },
{ 17, 2, "FADEOUT_FIELD" },
{ 18, 3, "EYE_ANIM" },
{ 19, 5, "MOUTH_ANIM" },
{ 20, 5, "HAND_ANIM" },
{ 21, 4, "LOOK_ANIM" },
{ 22, 4, "EXPRESSION" },
{ 23, 5, "LOOK_CAMERA" },
{ 24, 2, "LYRIC" },
{ 25, 0, "MUSIC_PLAY" },
{ 26, 2, "MODE_SELECT" },
{ 27, 4, "EDIT_MOTION" },
{ 28, 2, "BAR_TIME_SET" },
{ 29, 2, "SHADOWHEIGHT" },
{ 30, 1, "EDIT_FACE" },
{ 31, 21, "MOVE_CAMERA" },
{ 32, 0, "PV_END" },
{ 33, 3, "SHADOWPOS" },
{ 34, 2, "EDIT_LYRIC" },
{ 35, 5, "EDIT_TARGET" },
{ 36, 1, "EDIT_MOUTH" },
{ 37, 1, "SET_CHARA" },
{ 38, 7, "EDIT_MOVE" },
{ 39, 1, "EDIT_SHADOW" },
{ 40, 1, "EDIT_EYELID" },
{ 41, 2, "EDIT_EYE" },
{ 42, 1, "EDIT_ITEM" },
{ 43, 2, "EDIT_EFFECT" },
{ 44, 1, "EDIT_DISP" },
{ 45, 2, "EDIT_HAND_ANIM" },
{ 46, 3, "AIM" },
{ 47, 3, "HAND_ITEM" },
{ 48, 1, "EDIT_BLUSH" },
{ 49, 2, "NEAR_CLIP" },
{ 50, 2, "CLOTH_WET" },
{ 51, 3, "LIGHT_ROT" },
{ 52, 6, "SCENE_FADE" },
{ 53, 6, "TONE_TRANS" },
{ 54, 1, "SATURATE" },
{ 55, 1, "FADE_MODE" },
{ 56, 2, "AUTO_BLINK" },
{ 57, 3, "PARTS_DISP" },
{ 58, 1, "TARGET_FLYING_TIME" },
{ 59, 2, "CHARA_SIZE" },
{ 60, 2, "CHARA_HEIGHT_ADJUST" },
{ 61, 4, "ITEM_ANIM" },
{ 62, 4, "CHARA_POS_ADJUST" },
{ 63, 1, "SCENE_ROT" },
{ 64, 2, "EDIT_MOT_SMOOTH_LEN" },
{ 65, 1, "PV_BRANCH_MODE" },
{ 66, 2, "DATA_CAMERA_START" },
{ 67, 1, "MOVIE_PLAY" },
{ 68, 1, "MOVIE_DISP" },
{ 69, 3, "WIND" },
{ 70, 3, "OSAGE_STEP" },
{ 71, 3, "OSAGE_MV_CCL" },
{ 72, 2, "CHARA_COLOR" },
{ 73, 1, "SE_EFFECT" },
{ 74, 9, "EDIT_MOVE_XYZ" },
{ 75, 3, "EDIT_EYELID_ANIM" },
{ 76, 2, "EDIT_INSTRUMENT_ITEM" },
{ 77, 4, "EDIT_MOTION_LOOP" },
{ 78, 2, "EDIT_EXPRESSION" },
{ 79, 3, "EDIT_EYE_ANIM" },
{ 80, 2, "EDIT_MOUTH_ANIM" },
{ 81, 22, "EDIT_CAMERA" },
{ 82, 1, "EDIT_MODE_SELECT" },
{ 83, 2, "PV_END_FADEOUT" },
{ 84, 1, "RESERVE" },
{ 85, 6, "RESERVE" },
{ 86, 1, "RESERVE" },
{ 87, 9, "RESERVE" },
{ 88, 2, "PV_AUTH_LIGHT_PRIORITY" },
{ 89, 3, "PV_CHARA_LIGHT" },
{ 90, 3, "PV_STAGE_LIGHT" },
{ 91, 11, "TARGET_EFFECT" },
{ 92, 3, "FOG" },
{ 93, 2, "BLOOM" },
{ 94, 3, "COLOR_CORRECTION" },
{ 95, 3, "DOF" },
{ 96, 4, "CHARA_ALPHA" },
{ 97, 1, "AUTO_CAPTURE_BEGIN" },
{ 98, 1, "MANUAL_CAPTURE" },
{ 99, 3, "TOON_EDGE" },
{ 100, 3, "SHIMMER" },
{ 101, 4, "ITEM_ALPHA" },
{ 102, 1, "MOVIE_CUT" },
{ 103, 1, "CROSSFADE" },
{ 104, 1, "SUBFRAMERENDER" },
{ 105, 36, "EVENT_JUDGE" },
{ 106, 2, "TOON_EDGE" },
{ 107, 2, "FOG_ENABLE" },
{ 108, 112, "EDIT_CAMERA_BOX" },
{ 109, 1, "EDIT_STAGE_PARAM" },
{ 110, 1, "EDIT_CHANGE_FIELD" },
};
static const dsc_func dsc_x_func[] = {
{ 0, 0, "END" },
{ 1, 1, "TIME" },
{ 2, 4, "MIKU_MOVE" },
{ 3, 2, "MIKU_ROT" },
{ 4, 2, "MIKU_DISP" },
{ 5, 2, "MIKU_SHADOW" },
{ 6, 12, "TARGET" },
{ 7, 4, "SET_MOTION" },
{ 8, 2, "SET_PLAYDATA" },
{ 9, 6, "EFFECT" },
{ 10, 2, "FADEIN_FIELD" },
{ 11, 1, "EFFECT_OFF" },
{ 12, 6, "SET_CAMERA" },
{ 13, 2, "DATA_CAMERA" },
{ 14, 2, "CHANGE_FIELD" },
{ 15, 1, "HIDE_FIELD" },
{ 16, 3, "MOVE_FIELD" },
{ 17, 2, "FADEOUT_FIELD" },
{ 18, 3, "EYE_ANIM" },
{ 19, 5, "MOUTH_ANIM" },
{ 20, 5, "HAND_ANIM" },
{ 21, 4, "LOOK_ANIM" },
{ 22, 4, "EXPRESSION" },
{ 23, 5, "LOOK_CAMERA" },
{ 24, 2, "LYRIC" },
{ 25, 0, "MUSIC_PLAY" },
{ 26, 2, "MODE_SELECT" },
{ 27, 4, "EDIT_MOTION" },
{ 28, 2, "BAR_TIME_SET" },
{ 29, 2, "SHADOWHEIGHT" },
{ 30, 1, "EDIT_FACE" },
{ 31, 21, "DUMMY" },
{ 32, 0, "PV_END" },
{ 33, 3, "SHADOWPOS" },
{ 34, 2, "EDIT_LYRIC" },
{ 35, 5, "EDIT_TARGET" },
{ 36, 1, "EDIT_MOUTH" },
{ 37, 1, "SET_CHARA" },
{ 38, 7, "EDIT_MOVE" },
{ 39, 1, "EDIT_SHADOW" },
{ 40, 1, "EDIT_EYELID" },
{ 41, 2, "EDIT_EYE" },
{ 42, 1, "EDIT_ITEM" },
{ 43, 2, "EDIT_EFFECT" },
{ 44, 1, "EDIT_DISP" },
{ 45, 2, "EDIT_HAND_ANIM" },
{ 46, 3, "AIM" },
{ 47, 3, "HAND_ITEM" },
{ 48, 1, "EDIT_BLUSH" },
{ 49, 2, "NEAR_CLIP" },
{ 50, 2, "CLOTH_WET" },
{ 51, 3, "LIGHT_ROT" },
{ 52, 6, "SCENE_FADE" },
{ 53, 6, "TONE_TRANS" },
{ 54, 1, "SATURATE" },
{ 55, 1, "FADE_MODE" },
{ 56, 2, "AUTO_BLINK" },
{ 57, 3, "PARTS_DISP" },
{ 58, 1, "TARGET_FLYING_TIME" },
{ 59, 2, "CHARA_SIZE" },
{ 60, 2, "CHARA_HEIGHT_ADJUST" },
{ 61, 4, "ITEM_ANIM" },
{ 62, 4, "CHARA_POS_ADJUST" },
{ 63, 1, "SCENE_ROT" },
{ 64, 2, "EDIT_MOT_SMOOTH_LEN" },
{ 65, 1, "PV_BRANCH_MODE" },
{ 66, 2, "DATA_CAMERA_START" },
{ 67, 1, "MOVIE_PLAY" },
{ 68, 1, "MOVIE_DISP" },
{ 69, 3, "WIND" },
{ 70, 3, "OSAGE_STEP" },
{ 71, 3, "OSAGE_MV_CCL" },
{ 72, 2, "CHARA_COLOR" },
{ 73, 1, "SE_EFFECT" },
{ 74, 2, "CHARA_SHADOW_QUALITY" },
{ 75, 2, "STAGE_SHADOW_QUALITY" },
{ 76, 2, "COMMON_LIGHT" },
{ 77, 2, "TONE_MAP" },
{ 78, 2, "IBL_COLOR" },
{ 79, 2, "REFLECTION" },
{ 80, 3, "CHROMATIC_ABERRATION" },
{ 81, 2, "STAGE_SHADOW" },
{ 82, 2, "REFLECTION_QUALITY" },
{ 83, 2, "PV_END_FADEOUT" },
{ 84, 1, "CREDIT_TITLE" },
{ 85, 1, "BAR_POINT" },
{ 86, 1, "BEAT_POINT" },
{ 87, 0, "RESERVE" },
{ 88, 2, "PV_AUTH_LIGHT_PRIORITY" },
{ 89, 3, "PV_CHARA_LIGHT" },
{ 90, 3, "PV_STAGE_LIGHT" },
{ 91, 11, "TARGET_EFFECT" },
{ 92, 3, "FOG" },
{ 93, 2, "BLOOM" },
{ 94, 3, "COLOR_CORRECTION" },
{ 95, 3, "DOF" },
{ 96, 4, "CHARA_ALPHA" },
{ 97, 1, "AUTO_CAPTURE_BEGIN" },
{ 98, 1, "MANUAL_CAPTURE" },
{ 99, 3, "TOON_EDGE" },
{ 100, 3, "SHIMMER" },
{ 101, 4, "ITEM_ALPHA" },
{ 102, 1, "MOVIE_CUT" },
{ 103, 112, "EDIT_CAMERA_BOX" },
{ 104, 1, "EDIT_STAGE_PARAM" },
{ 105, 1, "EDIT_CHANGE_FIELD" },
{ 106, 7, "MIKUDAYO_ADJUST" },
{ 107, 2, "LYRIC_2" },
{ 108, 2, "LYRIC_READ" },
{ 109, 2, "LYRIC_READ_2" },
{ 110, 5, "ANNOTATION" },
{ 111, 2, "STAGE_EFFECT" },
{ 112, 3, "SONG_EFFECT" },
{ 113, 3, "SONG_EFFECT_ATTACH" },
{ 114, 2, "LIGHT_AUTH" },
{ 115, 2, "FADE" },
{ 116, 2, "SET_STAGE_EFFECT_ENV" },
{ 117, 2, "RESERVE" },
{ 118, 2, "COMMON_EFFECT_AET_FRONT" },
{ 119, 2, "COMMON_EFFECT_AET_FRONT_LOW" },
{ 120, 2, "COMMON_EFFECT_PARTICLE" },
{ 121, 3, "SONG_EFFECT_ALPHA_SORT" },
{ 122, 5, "LOOK_CAMERA_FACE_LIMIT" },
{ 123, 3, "ITEM_LIGHT" },
{ 124, 3, "CHARA_EFFECT" },
{ 125, 2, "MARKER" },
{ 126, 3, "CHARA_EFFECT_CHARA_LIGHT" },
{ 127, 2, "ENABLE_COMMON_LIGHT_TO_CHARA" },
{ 128, 2, "ENABLE_FXAA" },
{ 129, 2, "ENABLE_TEMPORAL_AA" },
{ 130, 2, "ENABLE_REFLECTION" },
{ 131, 2, "BANK_BRANCH" },
{ 132, 2, "BANK_END" },
{ 133, 2, "" },
{ 134, 2, "" },
{ 135, 2, "" },
{ 136, 2, "" },
{ 137, 2, "" },
{ 138, 2, "" },
{ 139, 2, "" },
{ 140, 2, "" },
{ 141, 2, "VR_LIVE_MOVIE" },
{ 142, 2, "VR_CHEER" },
{ 143, 2, "VR_CHARA_PSMOVE" },
{ 144, 2, "VR_MOVE_PATH" },
{ 145, 2, "VR_SET_BASE" },
{ 146, 2, "VR_TECH_DEMO_EFFECT" },
{ 147, 2, "VR_TRANSFORM" },
{ 148, 2, "GAZE" },
{ 149, 2, "TECH_DEMO_GESUTRE" },
{ 150, 2, "VR_CHEMICAL_LIGHT_COLOR" },
{ 151, 5, "VR_LIVE_MOB" },
{ 152, 9, "VR_LIVE_HAIR_OSAGE" },
{ 153, 9, "VR_LIVE_LOOK_CAMERA" },
{ 154, 5, "VR_LIVE_CHEER" },
{ 155, 3, "VR_LIVE_GESTURE" },
{ 156, 7, "VR_LIVE_CLONE" },
{ 157, 7, "VR_LOOP_EFFECT" },
{ 158, 6, "VR_LIVE_ONESHOT_EFFECT" },
{ 159, 9, "VR_LIVE_PRESENT" },
{ 160, 5, "VR_LIVE_TRANSFORM" },
{ 161, 5, "VR_LIVE_FLY" },
{ 162, 2, "VR_LIVE_CHARA_VOICE" },
};
static const dsc_func dsc_vrfl_func[] = {
{ 0, 0, "END" },
{ 1, 1, "TIME" },
{ 2, 4, "MIKU_MOVE" },
{ 3, 2, "MIKU_ROT" },
{ 4, 2, "MIKU_DISP" },
{ 5, 2, "MIKU_SHADOW" },
{ 6, 12, "TARGET" },
{ 7, 4, "SET_MOTION" },
{ 8, 2, "SET_PLAYDATA" },
{ 9, 6, "EFFECT" },
{ 10, 2, "FADEIN_FIELD" },
{ 11, 1, "EFFECT_OFF" },
{ 12, 6, "SET_CAMERA" },
{ 13, 2, "DATA_CAMERA" },
{ 14, 2, "CHANGE_FIELD" },
{ 15, 1, "HIDE_FIELD" },
{ 16, 3, "MOVE_FIELD" },
{ 17, 2, "FADEOUT_FIELD" },
{ 18, 3, "EYE_ANIM" },
{ 19, 5, "MOUTH_ANIM" },
{ 20, 5, "HAND_ANIM" },
{ 21, 4, "LOOK_ANIM" },
{ 22, 4, "EXPRESSION" },
{ 23, 5, "LOOK_CAMERA" },
{ 24, 2, "LYRIC" },
{ 25, 0, "MUSIC_PLAY" },
{ 26, 2, "MODE_SELECT" },
{ 27, 4, "EDIT_MOTION" },
{ 28, 2, "BAR_TIME_SET" },
{ 29, 2, "SHADOWHEIGHT" },
{ 30, 1, "EDIT_FACE" },
{ 31, 21, "DUMMY" },
{ 32, 0, "PV_END" },
{ 33, 3, "SHADOWPOS" },
{ 34, 2, "EDIT_LYRIC" },
{ 35, 5, "EDIT_TARGET" },
{ 36, 1, "EDIT_MOUTH" },
{ 37, 1, "SET_CHARA" },
{ 38, 7, "EDIT_MOVE" },
{ 39, 1, "EDIT_SHADOW" },
{ 40, 1, "EDIT_EYELID" },
{ 41, 2, "EDIT_EYE" },
{ 42, 1, "EDIT_ITEM" },
{ 43, 2, "EDIT_EFFECT" },
{ 44, 1, "EDIT_DISP" },
{ 45, 2, "EDIT_HAND_ANIM" },
{ 46, 3, "AIM" },
{ 47, 3, "HAND_ITEM" },
{ 48, 1, "EDIT_BLUSH" },
{ 49, 2, "NEAR_CLIP" },
{ 50, 2, "CLOTH_WET" },
{ 51, 3, "LIGHT_ROT" },
{ 52, 6, "SCENE_FADE" },
{ 53, 6, "TONE_TRANS" },
{ 54, 1, "SATURATE" },
{ 55, 1, "FADE_MODE" },
{ 56, 2, "AUTO_BLINK" },
{ 57, 3, "PARTS_DISP" },
{ 58, 1, "TARGET_FLYING_TIME" },
{ 59, 2, "CHARA_SIZE" },
{ 60, 2, "CHARA_HEIGHT_ADJUST" },
{ 61, 4, "ITEM_ANIM" },
{ 62, 4, "CHARA_POS_ADJUST" },
{ 63, 1, "SCENE_ROT" },
{ 64, 2, "EDIT_MOT_SMOOTH_LEN" },
{ 65, 1, "PV_BRANCH_MODE" },
{ 66, 2, "DATA_CAMERA_START" },
{ 67, 1, "MOVIE_PLAY" },
{ 68, 1, "MOVIE_DISP" },
{ 69, 3, "WIND" },
{ 70, 3, "OSAGE_STEP" },
{ 71, 3, "OSAGE_MV_CCL" },
{ 72, 2, "CHARA_COLOR" },
{ 73, 1, "SE_EFFECT" },
{ 74, 2, "CHARA_SHADOW_QUALITY" },
{ 75, 2, "STAGE_SHADOW_QUALITY" },
{ 76, 2, "COMMON_LIGHT" },
{ 77, 2, "TONE_MAP" },
{ 78, 2, "IBL_COLOR" },
{ 79, 2, "REFLECTION" },
{ 80, 3, "CHROMATIC_ABERRATION" },
{ 81, 2, "STAGE_SHADOW" },
{ 82, 2, "REFLECTION_QUALITY" },
{ 83, 2, "PV_END_FADEOUT" },
{ 84, 1, "CREDIT_TITLE" },
{ 85, 1, "BAR_POINT" },
{ 86, 1, "BEAT_POINT" },
{ 87, 0, "RESERVE" },
{ 88, 2, "PV_AUTH_LIGHT_PRIORITY" },
{ 89, 3, "PV_CHARA_LIGHT" },
{ 90, 3, "PV_STAGE_LIGHT" },
{ 91, 11, "TARGET_EFFECT" },
{ 92, 3, "FOG" },
{ 93, 2, "BLOOM" },
{ 94, 3, "COLOR_CORRECTION" },
{ 95, 3, "DOF" },
{ 96, 4, "CHARA_ALPHA" },
{ 97, 1, "AUTO_CAPTURE_BEGIN" },
{ 98, 1, "MANUAL_CAPTURE" },
{ 99, 3, "TOON_EDGE" },
{ 100, 3, "SHIMMER" },
{ 101, 4, "ITEM_ALPHA" },
{ 102, 1, "MOVIE_CUT" },
{ 103, 112, "EDIT_CAMERA_BOX" },
{ 104, 1, "EDIT_STAGE_PARAM" },
{ 105, 1, "EDIT_CHANGE_FIELD" },
{ 106, 7, "MIKUDAYO_ADJUST" },
{ 107, 2, "LYRIC_2" },
{ 108, 2, "LYRIC_READ" },
{ 109, 2, "LYRIC_READ_2" },
{ 110, 5, "ANNOTATION" },
{ 111, 2, "STAGE_EFFECT" },
{ 112, 3, "SONG_EFFECT" },
{ 113, 3, "SONG_EFFECT_ATTACH" },
{ 114, 2, "LIGHT_AUTH" },
{ 115, 2, "FADE" },
{ 116, 2, "SET_STAGE_EFFECT_ENV" },
{ 117, 2, "RESERVE" },
{ 118, 2, "COMMON_EFFECT_AET_FRONT" },
{ 119, 2, "COMMON_EFFECT_AET_FRONT_LOW" },
{ 120, 2, "COMMON_EFFECT_PARTICLE" },
{ 121, 3, "SONG_EFFECT_ALPHA_SORT" },
{ 122, 5, "LOOK_CAMERA_FACE_LIMIT" },
{ 123, 3, "ITEM_LIGHT" },
{ 124, 3, "CHARA_EFFECT" },
{ 125, 2, "MARKER" },
{ 126, 3, "CHARA_EFFECT_CHARA_LIGHT" },
{ 127, 2, "ENABLE_COMMON_LIGHT_TO_CHARA" },
{ 128, 2, "ENABLE_FXAA" },
{ 129, 2, "ENABLE_TEMPORAL_AA" },
{ 130, 2, "ENABLE_REFLECTION" },
{ 131, 2, "BANK_BRANCH" },
{ 132, 2, "BANK_END" },
{ 133, 2, "" },
{ 134, 2, "" },
{ 135, 2, "" },
{ 136, 2, "" },
{ 137, 2, "" },
{ 138, 2, "VR_LIVE_CHARA_MONITOR_UPDATE_Y" },
{ 139, 2, "VR_LIVE_POINT_FINGER" },
{ 140, 2, "VR_LIVE_CHARA_MONITOR" },
{ 141, 2, "VR_LIVE_MOVIE" },
{ 142, 2, "VR_CHEER" },
{ 143, 2, "VR_CHARA_PSMOVE" },
{ 144, 2, "VR_MOVE_PATH" },
{ 145, 2, "VR_SET_BASE" },
{ 146, 2, "VR_TECH_DEMO_EFFECT" },
{ 147, 2, "VR_TRANSFORM" },
{ 148, 2, "GAZE" },
{ 149, 2, "TECH_DEMO_GESUTRE" },
{ 150, 2, "VR_CHEMICAL_LIGHT_COLOR" },
{ 151, 5, "VR_LIVE_MOB" },
{ 152, 9, "VR_LIVE_HAIR_OSAGE" },
{ 153, 9, "VR_LIVE_LOOK_CAMERA" },
{ 154, 5, "VR_LIVE_CHEER" },
{ 155, 3, "VR_LIVE_GESTURE" },
{ 156, 7, "VR_LIVE_CLONE" },
{ 157, 7, "VR_LOOP_EFFECT" },
{ 158, 6, "VR_LIVE_ONESHOT_EFFECT" },
{ 159, 9, "VR_LIVE_PRESENT" },
{ 160, 7, "VR_LIVE_TRANSFORM" },
{ 161, 5, "VR_LIVE_FLY" },
{ 162, 2, "VR_LIVE_CHARA_VOICE" },
};
#define DSC_AC101_FUNC_COUNT 36
#define DSC_AC110_FUNC_COUNT 37
#define DSC_AC120_FUNC_COUNT 40
#define DSC_AC200_FUNC_COUNT 58
#define DSC_AC210_FUNC_COUNT 64
#define DSC_AC500_FUNC_COUNT 65
#define DSC_AC510_FUNC_COUNT 87
#define DSC_AFT101_FUNC_COUNT 88
#define DSC_AFT200_FUNC_COUNT 90
#define DSC_AFT300_FUNC_COUNT 91
#define DSC_AFT310_FUNC_COUNT 92
#define DSC_AFT410_FUNC_COUNT 105
#define DSC_AFT701_FUNC_COUNT 106
#define DSC_FT_FUNC_COUNT 107
#define DSC_PSP_FUNC_COUNT 36
#define DSC_2ND_FUNC_COUNT 49
#define DSC_DT_FUNC_COUNT 36
#define DSC_DT2_FUNC_COUNT 64
#define DSC_F_FUNC_COUNT 84
#define DSC_F2_FUNC_COUNT 111
#define DSC_MGF_FUNC_COUNT 111
#define DSC_X_FUNC_COUNT 163
#define DSC_VRFL_FUNC_COUNT 163
const int32_t dsc_ac101_func_count = DSC_AC101_FUNC_COUNT;
const int32_t dsc_ac110_func_count = DSC_AC110_FUNC_COUNT;
const int32_t dsc_ac120_func_count = DSC_AC120_FUNC_COUNT;
const int32_t dsc_ac200_func_count = DSC_AC200_FUNC_COUNT;
const int32_t dsc_ac210_func_count = DSC_AC210_FUNC_COUNT;
const int32_t dsc_ac500_func_count = DSC_AC500_FUNC_COUNT;
const int32_t dsc_ac510_func_count = DSC_AC510_FUNC_COUNT;
const int32_t dsc_aft101_func_count = DSC_AFT101_FUNC_COUNT;
const int32_t dsc_aft200_func_count = DSC_AFT200_FUNC_COUNT;
const int32_t dsc_aft300_func_count = DSC_AFT300_FUNC_COUNT;
const int32_t dsc_aft310_func_count = DSC_AFT310_FUNC_COUNT;
const int32_t dsc_aft410_func_count = DSC_AFT410_FUNC_COUNT;
const int32_t dsc_aft701_func_count = DSC_AFT701_FUNC_COUNT;
const int32_t dsc_ft_func_count = DSC_FT_FUNC_COUNT;
const int32_t dsc_psp_func_count = DSC_PSP_FUNC_COUNT;
const int32_t dsc_2nd_func_count = DSC_2ND_FUNC_COUNT;
const int32_t dsc_dt_func_count = DSC_DT_FUNC_COUNT;
const int32_t dsc_dt2_func_count = DSC_DT2_FUNC_COUNT;
const int32_t dsc_f_func_count = DSC_F_FUNC_COUNT;
const int32_t dsc_f2_func_count = DSC_F2_FUNC_COUNT;
const int32_t dsc_mgf_func_count = DSC_MGF_FUNC_COUNT;
const int32_t dsc_x_func_count = DSC_X_FUNC_COUNT;
const int32_t dsc_vrfl_func_count = DSC_VRFL_FUNC_COUNT;
inline int32_t dsc_ac101_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC101_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac101_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac110_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC110_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac110_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac120_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC120_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac120_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac200_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC200_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac200_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac210_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC210_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac210_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac500_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC500_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac500_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac510_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AC510_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ac510_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_aft101_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AFT101_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_aft101_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_aft200_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AFT200_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_aft200_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_aft300_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AFT300_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_aft300_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_aft310_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AFT310_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_aft310_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_aft410_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AFT410_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_aft410_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_aft701_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_AFT701_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_aft701_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ft_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_FT_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_ft_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_psp_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_PSP_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_psp_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_2nd_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_2ND_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_2nd_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_dt_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_DT_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_dt_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_dt2_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_DT2_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_dt2_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_f_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_F_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_f_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_f2_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_F2_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_f2_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_mgf_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_MGF_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_mgf_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_x_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_X_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_x_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_vrfl_get_func_id(const char* name) {
uint64_t name_hash = hash_utf8_fnv1a64m(name);
for (int32_t i = 0; i < DSC_VRFL_FUNC_COUNT; i++)
if (name_hash == hash_utf8_fnv1a64m(dsc_vrfl_get_func_name(i)))
return i;
return -1;
}
inline int32_t dsc_ac101_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC101_FUNC_COUNT ? dsc_ac101_func[id].length : -1;
}
inline int32_t dsc_ac110_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC110_FUNC_COUNT ? dsc_ac101_func[id].length : -1;
}
inline int32_t dsc_ac120_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC120_FUNC_COUNT ? dsc_ac101_func[id].length : -1;
}
inline int32_t dsc_ac200_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC200_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_ac210_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_ac500_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_ac510_get_func_length(int32_t id) {
return id > -1 && id < DSC_AC510_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_aft101_get_func_length(int32_t id) {
return id > -1 && id < DSC_AFT101_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_aft200_get_func_length(int32_t id) {
return id > -1 && id < DSC_AFT200_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_aft300_get_func_length(int32_t id) {
return id > -1 && id < DSC_AFT300_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_aft310_get_func_length(int32_t id) {
return id > -1 && id < DSC_AFT310_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_aft410_get_func_length(int32_t id) {
return id > -1 && id < DSC_AFT410_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_aft701_get_func_length(int32_t id) {
return id > -1 && id < DSC_AFT701_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_ft_get_func_length(int32_t id) {
return id > -1 && id < DSC_FT_FUNC_COUNT ? dsc_ac_func[id].length : -1;
}
inline int32_t dsc_psp_get_func_length(int32_t id) {
return id > -1 && id < DSC_PSP_FUNC_COUNT ? dsc_ac101_func[id].length : -1;
}
inline int32_t dsc_2nd_get_func_length(int32_t id) {
return id > -1 && id < DSC_2ND_FUNC_COUNT ? dsc_f_func[id].length : -1;
}
inline int32_t dsc_dt_get_func_length(int32_t id) {
return id > -1 && id < DSC_DT_FUNC_COUNT ? dsc_ac101_func[id].length : -1;
}
inline int32_t dsc_dt2_get_func_length(int32_t id) {
return id > -1 && id < DSC_DT2_FUNC_COUNT ? dsc_f_func[id].length : -1;
}
inline int32_t dsc_f_get_func_length(int32_t id) {
return id > -1 && id < DSC_F_FUNC_COUNT ? dsc_f_func[id].length : -1;
}
inline int32_t dsc_f2_get_func_length(int32_t id) {
return id > -1 && id < DSC_F2_FUNC_COUNT ? dsc_f2_func[id].length : -1;
}
inline int32_t dsc_mgf_get_func_length(int32_t id) {
return id > -1 && id < DSC_MGF_FUNC_COUNT ? dsc_mgf_func[id].length : -1;
}
inline int32_t dsc_x_get_func_length(int32_t id) {
return id > -1 && id < DSC_X_FUNC_COUNT ? dsc_x_func[id].length : -1;
}
inline int32_t dsc_vrfl_get_func_length(int32_t id) {
return id > -1 && id < DSC_VRFL_FUNC_COUNT ? dsc_vrfl_func[id].length : -1;
}
inline int32_t dsc_ac200_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AC200_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_ac210_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_ac500_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AC500_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_ac510_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AC510_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_aft101_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AFT101_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_aft200_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AFT200_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_aft300_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AFT300_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_aft310_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AFT310_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_aft410_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AFT410_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_aft701_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_AFT701_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_ft_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_FT_FUNC_COUNT ? dsc_ac_func[id].length_old : -1;
}
inline int32_t dsc_dt2_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_DT_FUNC_COUNT ? dsc_f_func[id].length_old : -1;
}
inline int32_t dsc_f_get_func_length_old(int32_t id) {
return id > -1 && id < DSC_F_FUNC_COUNT ? dsc_f_func[id].length_old : -1;
}
inline const char* dsc_ac101_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC101_FUNC_COUNT ? dsc_ac101_func[id].name : 0;
}
inline const char* dsc_ac110_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC110_FUNC_COUNT ? dsc_ac101_func[id].name : 0;
}
inline const char* dsc_ac120_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC120_FUNC_COUNT ? dsc_ac101_func[id].name : 0;
}
inline const char* dsc_ac200_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC200_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_ac210_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC210_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_ac500_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC500_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_ac510_get_func_name(int32_t id) {
return id > -1 && id < DSC_AC510_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_aft101_get_func_name(int32_t id) {
return id > -1 && id < DSC_AFT101_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_aft200_get_func_name(int32_t id) {
return id > -1 && id < DSC_AFT200_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_aft300_get_func_name(int32_t id) {
return id > -1 && id < DSC_AFT300_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_aft310_get_func_name(int32_t id) {
return id > -1 && id < DSC_AFT310_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_aft410_get_func_name(int32_t id) {
return id > -1 && id < DSC_AFT410_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_aft701_get_func_name(int32_t id) {
return id > -1 && id < DSC_AFT701_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_ft_get_func_name(int32_t id) {
return id > -1 && id < DSC_FT_FUNC_COUNT ? dsc_ac_func[id].name : 0;
}
inline const char* dsc_psp_get_func_name(int32_t id) {
return id > -1 && id < DSC_PSP_FUNC_COUNT ? dsc_ac101_func[id].name : 0;
}
inline const char* dsc_2nd_get_func_name(int32_t id) {
return id > -1 && id < DSC_2ND_FUNC_COUNT ? dsc_f_func[id].name : 0;
}
inline const char* dsc_dt_get_func_name(int32_t id) {
return id > -1 && id < DSC_DT_FUNC_COUNT ? dsc_ac101_func[id].name : 0;
}
inline const char* dsc_dt2_get_func_name(int32_t id) {
return id > -1 && id < DSC_DT2_FUNC_COUNT ? dsc_f_func[id].name : 0;
}
inline const char* dsc_f_get_func_name(int32_t id) {
return id > -1 && id < DSC_F_FUNC_COUNT ? dsc_f_func[id].name : 0;
}
inline const char* dsc_f2_get_func_name(int32_t id) {
return id > -1 && id < DSC_F2_FUNC_COUNT ? dsc_f2_func[id].name : 0;
}
inline const char* dsc_mgf_get_func_name(int32_t id) {
return id > -1 && id < DSC_MGF_FUNC_COUNT ? dsc_mgf_func[id].name : 0;
}
inline const char* dsc_x_get_func_name(int32_t id) {
return id > -1 && id < DSC_X_FUNC_COUNT ? dsc_x_func[id].name : 0;
}
inline const char* dsc_vrfl_get_func_name(int32_t id) {
return id > -1 && id < DSC_VRFL_FUNC_COUNT ? dsc_vrfl_func[id].name : 0;
}
struct dsc_data_time {
int32_t time;
int32_t pv_branch_mode;
const char* name;
int32_t func;
uint32_t data_offset;
};
static void dsc_convert_from_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_from_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_to_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_change_field1_to_change_field2(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_change_field2_to_change_field1(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_dummy(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_note7_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_note7_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_note11_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_note11_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_note12_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static void dsc_convert_note12_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data);
static uint32_t* dsc_replace_add_func(dsc_replace* dr, dsc_replace_data* drd);
inline static dsc_get_func_length dsc_type_get_dsc_get_func_length(dsc_type type, bool has_perf_id);
inline int32_t dsc_type_get_dsc_func_count(dsc_type type) {
switch (type) {
case DSC_NONE:
default:
return DSC_FT_FUNC_COUNT;
case DSC_AC101:
return DSC_AC101_FUNC_COUNT;
case DSC_AC110:
return DSC_AC110_FUNC_COUNT;
case DSC_AC120:
return DSC_AC120_FUNC_COUNT;
case DSC_AC200:
return DSC_AC200_FUNC_COUNT;
case DSC_AC210:
return DSC_AC210_FUNC_COUNT;
case DSC_AC500:
return DSC_AC500_FUNC_COUNT;
case DSC_AC510:
return DSC_AC510_FUNC_COUNT;
case DSC_AFT101:
return DSC_AFT101_FUNC_COUNT;
case DSC_AFT200:
return DSC_AFT200_FUNC_COUNT;
case DSC_AFT300:
return DSC_AFT300_FUNC_COUNT;
case DSC_AFT310:
return DSC_AFT310_FUNC_COUNT;
case DSC_AFT410:
return DSC_AFT410_FUNC_COUNT;
case DSC_AFT701:
return DSC_AFT701_FUNC_COUNT;
case DSC_FT:
return DSC_FT_FUNC_COUNT;
case DSC_PSP:
return DSC_PSP_FUNC_COUNT;
case DSC_2ND:
return DSC_2ND_FUNC_COUNT;
case DSC_DT:
return DSC_DT_FUNC_COUNT;
case DSC_DT2:
return DSC_DT2_FUNC_COUNT;
case DSC_F:
return DSC_F_FUNC_COUNT;
case DSC_F2:
return DSC_F2_FUNC_COUNT;
case DSC_MGF:
return DSC_MGF_FUNC_COUNT;
case DSC_X:
return DSC_X_FUNC_COUNT;
case DSC_VRFL:
return DSC_VRFL_FUNC_COUNT;
}
}
inline dsc_get_func_id dsc_type_get_dsc_get_func_id(dsc_type type) {
switch (type) {
case DSC_NONE:
default:
return dsc_ft_get_func_id;
case DSC_AC101:
return dsc_ac101_get_func_id;
case DSC_AC110:
return dsc_ac110_get_func_id;
case DSC_AC120:
return dsc_ac120_get_func_id;
case DSC_AC200:
return dsc_ac200_get_func_id;
case DSC_AC210:
return dsc_ac210_get_func_id;
case DSC_AC500:
return dsc_ac500_get_func_id;
case DSC_AC510:
return dsc_ac510_get_func_id;
case DSC_AFT101:
return dsc_aft101_get_func_id;
case DSC_AFT200:
return dsc_aft200_get_func_id;
case DSC_AFT300:
return dsc_aft300_get_func_id;
case DSC_AFT310:
return dsc_aft310_get_func_id;
case DSC_AFT410:
return dsc_aft410_get_func_id;
case DSC_AFT701:
return dsc_aft701_get_func_id;
case DSC_FT:
return dsc_ft_get_func_id;
case DSC_PSP:
return dsc_psp_get_func_id;
case DSC_2ND:
return dsc_2nd_get_func_id;
case DSC_DT:
return dsc_dt_get_func_id;
case DSC_DT2:
return dsc_dt2_get_func_id;
case DSC_F:
return dsc_f_get_func_id;
case DSC_F2:
return dsc_f2_get_func_id;
case DSC_MGF:
return dsc_mgf_get_func_id;
case DSC_X:
return dsc_x_get_func_id;
case DSC_VRFL:
return dsc_vrfl_get_func_id;
}
}
inline dsc_get_func_length dsc_type_get_dsc_get_func_length(dsc_type type, bool has_perf_id) {
if (has_perf_id)
switch (type) {
case DSC_NONE:
default:
return dsc_ft_get_func_length;
case DSC_AC101:
return dsc_ac101_get_func_length;
case DSC_AC110:
return dsc_ac110_get_func_length;
case DSC_AC120:
return dsc_ac120_get_func_length;
case DSC_AC200:
return dsc_ac200_get_func_length;
case DSC_AC210:
return dsc_ac210_get_func_length;
case DSC_AC500:
return dsc_ac500_get_func_length;
case DSC_AC510:
return dsc_ac510_get_func_length;
case DSC_AFT101:
return dsc_aft101_get_func_length;
case DSC_AFT200:
return dsc_aft200_get_func_length;
case DSC_AFT300:
return dsc_aft300_get_func_length;
case DSC_AFT310:
return dsc_aft310_get_func_length;
case DSC_AFT410:
return dsc_aft410_get_func_length;
case DSC_AFT701:
return dsc_aft701_get_func_length;
case DSC_FT:
return dsc_ft_get_func_length;
case DSC_PSP:
return dsc_psp_get_func_length;
case DSC_2ND:
return dsc_2nd_get_func_length;
case DSC_DT:
return dsc_dt_get_func_length;
case DSC_DT2:
return dsc_dt2_get_func_length;
case DSC_F:
return dsc_f_get_func_length;
case DSC_F2:
return dsc_f2_get_func_length;
case DSC_MGF:
return dsc_mgf_get_func_length;
case DSC_X:
return dsc_x_get_func_length;
case DSC_VRFL:
return dsc_vrfl_get_func_length;
}
else
switch (type) {
case DSC_NONE:
default:
return dsc_ft_get_func_length;
case DSC_AC101:
return dsc_ac101_get_func_length;
case DSC_AC110:
return dsc_ac110_get_func_length;
case DSC_AC120:
return dsc_ac120_get_func_length;
case DSC_AC200:
return dsc_ac200_get_func_length_old;
case DSC_AC210:
return dsc_ac210_get_func_length_old;
case DSC_AC500:
return dsc_ac500_get_func_length_old;
case DSC_AC510:
return dsc_ac510_get_func_length_old;
case DSC_AFT101:
return dsc_aft101_get_func_length_old;
case DSC_AFT200:
return dsc_aft200_get_func_length_old;
case DSC_AFT300:
return dsc_aft300_get_func_length_old;
case DSC_AFT310:
return dsc_aft310_get_func_length_old;
case DSC_AFT410:
return dsc_aft410_get_func_length_old;
case DSC_AFT701:
return dsc_aft701_get_func_length_old;
case DSC_FT:
return dsc_ft_get_func_length;
case DSC_PSP:
return dsc_psp_get_func_length;
case DSC_2ND:
return dsc_2nd_get_func_length;
case DSC_DT:
return dsc_dt_get_func_length;
case DSC_DT2:
return dsc_dt2_get_func_length;
case DSC_F:
return dsc_f_get_func_length_old;
case DSC_F2:
return dsc_f2_get_func_length;
case DSC_MGF:
return dsc_mgf_get_func_length;
case DSC_X:
return dsc_x_get_func_length;
case DSC_VRFL:
return dsc_vrfl_get_func_length;
}
}
inline dsc_get_func_name dsc_type_get_dsc_get_func_name(dsc_type type) {
switch (type) {
case DSC_NONE:
default:
return dsc_ft_get_func_name;
case DSC_AC101:
return dsc_ac101_get_func_name;
case DSC_AC110:
return dsc_ac110_get_func_name;
case DSC_AC120:
return dsc_ac120_get_func_name;
case DSC_AC200:
return dsc_ac200_get_func_name;
case DSC_AC210:
return dsc_ac210_get_func_name;
case DSC_AC500:
return dsc_ac500_get_func_name;
case DSC_AC510:
return dsc_ac510_get_func_name;
case DSC_AFT101:
return dsc_aft101_get_func_name;
case DSC_AFT200:
return dsc_aft200_get_func_name;
case DSC_AFT300:
return dsc_aft300_get_func_name;
case DSC_AFT310:
return dsc_aft310_get_func_name;
case DSC_AFT410:
return dsc_aft410_get_func_name;
case DSC_AFT701:
return dsc_aft701_get_func_name;
case DSC_FT:
return dsc_ft_get_func_name;
case DSC_PSP:
return dsc_psp_get_func_name;
case DSC_2ND:
return dsc_2nd_get_func_name;
case DSC_DT:
return dsc_dt_get_func_name;
case DSC_DT2:
return dsc_dt2_get_func_name;
case DSC_F:
return dsc_f_get_func_name;
case DSC_F2:
return dsc_f2_get_func_name;
case DSC_MGF:
return dsc_mgf_get_func_name;
case DSC_X:
return dsc_x_get_func_name;
case DSC_VRFL:
return dsc_vrfl_get_func_name;
}
}
static void dsc_convert_from_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* cloth_wet = dsc_replace_add_func(dr, drd);
cloth_wet[0] = 0;
cloth_wet[1] = data[0];
}
static void dsc_convert_from_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* edit_face = dsc_replace_add_func(dr, drd);
edit_face[0] = data[0];
}
static void dsc_convert_from_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* edit_motion = dsc_replace_add_func(dr, drd);
edit_motion[0] = data[0];
edit_motion[1] = data[1];
edit_motion[2] = 0;
edit_motion[3] = 0;
}
static void dsc_convert_from_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* effect = dsc_replace_add_func(dr, drd);
effect[0] = 0;
effect[1] = data[0];
effect[2] = data[1];
effect[3] = data[2];
effect[4] = data[3];
effect[5] = data[4];
}
static void dsc_convert_from_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* expression = dsc_replace_add_func(dr, drd);
expression[0] = 0;
expression[1] = data[0];
expression[2] = data[1];
expression[3] = data[2];
}
static void dsc_convert_from_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* eye_anim = dsc_replace_add_func(dr, drd);
eye_anim[0] = 0;
eye_anim[1] = data[0];
eye_anim[2] = data[1];
}
static void dsc_convert_from_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* hand_anim = dsc_replace_add_func(dr, drd);
hand_anim[0] = 0;
hand_anim[1] = data[0];
hand_anim[2] = data[1];
hand_anim[3] = data[2];
hand_anim[4] = data[3];
}
static void dsc_convert_from_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* look_anim = dsc_replace_add_func(dr, drd);
look_anim[0] = 0;
look_anim[1] = data[0];
look_anim[2] = data[1];
look_anim[3] = data[2];
}
static void dsc_convert_from_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* look_camera = dsc_replace_add_func(dr, drd);
look_camera[0] = 0;
look_camera[1] = data[0];
look_camera[2] = data[1];
look_camera[3] = data[2];
look_camera[4] = data[3];
}
static void dsc_convert_from_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* lyric = dsc_replace_add_func(dr, drd);
lyric[0] = data[0];
lyric[1] = 0xFFFFFFFF;
}
static void dsc_convert_from_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* miku_disp = dsc_replace_add_func(dr, drd);
miku_disp[0] = 0;
miku_disp[1] = data[0];
}
static void dsc_convert_from_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* miku_move = dsc_replace_add_func(dr, drd);
miku_move[0] = 0;
miku_move[1] = data[0];
miku_move[2] = data[1];
miku_move[3] = data[2];
}
static void dsc_convert_from_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* miku_rot = dsc_replace_add_func(dr, drd);
miku_rot[0] = 0;
miku_rot[1] = data[0];
}
static void dsc_convert_from_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* miku_shadow = dsc_replace_add_func(dr, drd);
miku_shadow[0] = 0;
miku_shadow[1] = data[0];
}
static void dsc_convert_from_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* mode_select = dsc_replace_add_func(dr, drd);
mode_select[0] = 0x1F;
mode_select[1] = data[0];
}
static void dsc_convert_from_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* mouth_anim = dsc_replace_add_func(dr, drd);
mouth_anim[0] = 0;
mouth_anim[1] = 0;
mouth_anim[2] = data[0];
mouth_anim[3] = data[1];
mouth_anim[4] = data[2];
}
static void dsc_convert_from_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* move_camera = dsc_replace_add_func(dr, drd);
memmove(move_camera, data, sizeof(uint32_t) * 19);
move_camera[19] = 0;
move_camera[20] = 1000;
}
static void dsc_convert_from_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* set_motion = dsc_replace_add_func(dr, drd);
set_motion[0] = 0;
set_motion[1] = data[0];
set_motion[2] = data[1];
set_motion[3] = data[2];
}
static void dsc_convert_from_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* set_playdata = dsc_replace_add_func(dr, drd);
set_playdata[0] = 0;
set_playdata[1] = data[0];
}
static void dsc_convert_from_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* shadowheight = dsc_replace_add_func(dr, drd);
shadowheight[0] = 0;
shadowheight[1] = data[0];
}
static void dsc_convert_from_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* shadowpos = dsc_replace_add_func(dr, drd);
shadowpos[0] = 0;
shadowpos[1] = data[0];
shadowpos[2] = data[1];
}
static void dsc_convert_to_ac100_cloth_wet(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* cloth_wet = dsc_replace_add_func(dr, drd);
cloth_wet[0] = data[1];
}
static void dsc_convert_to_ac100_edit_face(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* edit_face = dsc_replace_add_func(dr, drd);
edit_face[0] = data[0];
edit_face[1] = -1;
}
static void dsc_convert_to_ac100_edit_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* edit_motion = dsc_replace_add_func(dr, drd);
edit_motion[0] = data[0];
edit_motion[1] = data[1];
}
static void dsc_convert_to_ac100_effect(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* effect = dsc_replace_add_func(dr, drd);
effect[0] = data[1];
effect[1] = data[2];
effect[2] = data[3];
effect[3] = data[4];
effect[4] = data[5];
}
static void dsc_convert_to_ac100_expression(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* expression = dsc_replace_add_func(dr, drd);
expression[0] = data[1];
expression[1] = data[2];
expression[2] = data[3];
expression[3] = data[4];
}
static void dsc_convert_to_ac100_eye_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* eye_anim = dsc_replace_add_func(dr, drd);
eye_anim[0] = data[1];
eye_anim[1] = data[2];
}
static void dsc_convert_to_ac100_hand_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* hand_anim = dsc_replace_add_func(dr, drd);
hand_anim[0] = data[1];
hand_anim[1] = data[2];
hand_anim[2] = data[3];
hand_anim[3] = data[4];
}
static void dsc_convert_to_ac100_look_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* look_anim = dsc_replace_add_func(dr, drd);
look_anim[0] = data[1];
look_anim[1] = data[2];
look_anim[2] = data[3];
}
static void dsc_convert_to_ac100_look_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* look_camera = dsc_replace_add_func(dr, drd);
look_camera[0] = data[1];
look_camera[1] = data[2];
look_camera[2] = data[3];
look_camera[3] = data[4];
}
static void dsc_convert_to_ac100_lyric(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* lyric = dsc_replace_add_func(dr, drd);
lyric[0] = data[0];
}
static void dsc_convert_to_ac100_miku_disp(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* miku_disp = dsc_replace_add_func(dr, drd);
miku_disp[0] = data[1];
}
static void dsc_convert_to_ac100_miku_move(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* miku_move = dsc_replace_add_func(dr, drd);
miku_move[0] = data[1];
miku_move[1] = data[2];
miku_move[2] = data[3];
}
static void dsc_convert_to_ac100_miku_rot(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* miku_rot = dsc_replace_add_func(dr, drd);
miku_rot[0] = data[1];
}
static void dsc_convert_to_ac100_miku_shadow(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* miku_shadow = dsc_replace_add_func(dr, drd);
miku_shadow[0] = data[1];
}
static void dsc_convert_to_ac100_mode_select(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* mode_select = dsc_replace_add_func(dr, drd);
mode_select[0] = data[1];
}
static void dsc_convert_to_ac100_mouth_anim(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* mouth_anim = dsc_replace_add_func(dr, drd);
mouth_anim[0] = data[2];
mouth_anim[1] = data[3];
mouth_anim[2] = data[4];
}
static void dsc_convert_to_ac100_move_camera(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* move_camera = dsc_replace_add_func(dr, drd);
memmove(move_camera, data, sizeof(uint32_t) * 19);
}
static void dsc_convert_to_ac100_set_motion(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* set_motion = dsc_replace_add_func(dr, drd);
set_motion[0] = data[1];
set_motion[1] = data[2];
set_motion[2] = data[3];
}
static void dsc_convert_to_ac100_set_playdata(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* set_playdata = dsc_replace_add_func(dr, drd);
set_playdata[0] = data[1];
}
static void dsc_convert_to_ac100_shadowheight(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* shadowheight = dsc_replace_add_func(dr, drd);
shadowheight[0] = data[1];
}
static void dsc_convert_to_ac100_shadowpos(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
if (data[0])
return;
uint32_t* shadowpos = dsc_replace_add_func(dr, drd);
shadowpos[0] = data[1];
shadowpos[1] = data[2];
}
static void dsc_convert_change_field1_to_change_field2(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* change_field1 = dsc_replace_add_func(dr, drd);
change_field1[0] = data[0];
change_field1[1] = 1;
}
static void dsc_convert_change_field2_to_change_field1(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
uint32_t* change_field1 = dsc_replace_add_func(dr, drd);
change_field1[0] = data[0];
}
static void dsc_convert_dummy(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
}
static void dsc_convert_note7_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
dsc_note7* dn = (dsc_note7*)data;
dsc_note11* note11 = (dsc_note11*)dsc_replace_add_func(dr, drd);
note11->type = dn->type;
note11->hold_timer = -1;
note11->hold_end = -1;
note11->x_pos = dn->x_pos;
note11->y_pos = dn->y_pos;
note11->angle = dn->angle;
note11->wave_count = dn->wave_count;
note11->distance = dn->distance;
note11->amplitude = dn->amplitude;
note11->target_flying_time = dr->target_flying_time;
note11->time_signature = dr->target_flying_time != -1000 ? dr->time_signature : 0;
}
static void dsc_convert_note7_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
dsc_note7* dn = (dsc_note7*)data;
dsc_note12* note12 = (dsc_note12*)dsc_replace_add_func(dr, drd);
note12->type = dn->type;
note12->hold_timer = -1;
note12->hold_end = -1;
note12->x_pos = dn->x_pos;
note12->y_pos = dn->y_pos;
note12->angle = dn->angle;
note12->wave_count = dn->wave_count;
note12->distance = dn->distance;
note12->amplitude = dn->amplitude;
note12->target_flying_time = dr->target_flying_time;
note12->time_signature = dr->target_flying_time != -1000 ? dr->time_signature : 0;
note12->target_effect = -1;
}
static void dsc_convert_note11_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
dsc_note11* dn = (dsc_note11*)data;
if (dn->target_flying_time != -1000) {
if (dr->time_signature != dn->time_signature) {
dsc_replace_data* repl_data = &dr->replace_data[dr->bar_time_set_func_id];
uint32_t* bar_time_set = dsc_replace_add_func(dr, repl_data);
*bar_time_set++ = dr->bpm;
*bar_time_set++ = dn->time_signature;
dr->time_signature = dn->time_signature;
}
if (dr->target_flying_time != dn->target_flying_time) {
dsc_replace_data* repl_data = &dr->replace_data[dr->target_flying_time_func_id];
uint32_t* target_flying_time = dsc_replace_add_func(dr, repl_data);
*target_flying_time++ = dn->target_flying_time;
dr->target_flying_time = dn->target_flying_time;
}
}
dsc_note7* note7 = (dsc_note7*)dsc_replace_add_func(dr, drd);
note7->type = dn->type;
note7->x_pos = dn->x_pos;
note7->y_pos = dn->y_pos;
note7->angle = dn->angle;
note7->distance = dn->distance;
note7->amplitude = dn->amplitude;
note7->wave_count = dn->wave_count;
}
static void dsc_convert_note11_to_note12(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
dsc_note11* dn = (dsc_note11*)data;
dsc_note12* note12 = (dsc_note12*)dsc_replace_add_func(dr, drd);
note12->type = dn->type;
note12->hold_timer = dn->hold_timer;
note12->hold_end = dn->hold_end;
note12->x_pos = dn->x_pos;
note12->y_pos = dn->y_pos;
note12->angle = dn->angle;
note12->wave_count = dn->wave_count;
note12->distance = dn->distance;
note12->amplitude = dn->amplitude;
note12->target_flying_time = dn->target_flying_time;
note12->time_signature = dn->time_signature;
note12->target_effect = -1;
}
static void dsc_convert_note12_to_note7(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
dsc_note12* dn = (dsc_note12*)data;
if (dn->target_flying_time != -1000) {
if (dr->time_signature != dn->time_signature) {
dsc_replace_data* repl_data = &dr->replace_data[dr->bar_time_set_func_id];
uint32_t* bar_time_set = dsc_replace_add_func(dr, repl_data);
*bar_time_set++ = dr->bpm;
*bar_time_set++ = dn->time_signature;
dr->time_signature = dn->time_signature;
}
if (dr->target_flying_time != dn->target_flying_time) {
dsc_replace_data* repl_data = &dr->replace_data[dr->target_flying_time_func_id];
uint32_t* target_flying_time = dsc_replace_add_func(dr, repl_data);
*target_flying_time++ = dn->target_flying_time;
dr->target_flying_time = dn->target_flying_time;
}
}
dsc_note7* note7 = (dsc_note7*)dsc_replace_add_func(dr, drd);
note7->type = dn->type;
note7->x_pos = dn->x_pos;
note7->y_pos = dn->y_pos;
note7->angle = dn->angle;
note7->distance = dn->distance;
note7->amplitude = dn->amplitude;
note7->wave_count = dn->wave_count;
}
static void dsc_convert_note12_to_note11(dsc_replace* dr, dsc_replace_data* drd, uint32_t* data) {
dsc_note12* dn = (dsc_note12*)data;
dsc_note11* note11 = (dsc_note11*)dsc_replace_add_func(dr, drd);
note11->type = dn->type;
note11->hold_timer = dn->hold_timer;
note11->hold_end = dn->hold_end;
note11->x_pos = dn->x_pos;
note11->y_pos = dn->y_pos;
note11->angle = dn->angle;
note11->wave_count = dn->wave_count;
note11->distance = dn->distance;
note11->amplitude = dn->amplitude;
note11->target_flying_time = dn->target_flying_time;
note11->time_signature = dn->time_signature;
}
uint32_t* dsc::add_func(const char* name, int32_t func, int32_t func_length) {
dsc_data dsc_d;
dsc_d.name = name;
dsc_d.func = func;
dsc_d.data_offset = (uint32_t)data_buffer.size();
data.push_back(dsc_d);
data_buffer.resize((size_t)dsc_d.data_offset + func_length);
return data_buffer.data() + dsc_d.data_offset;
}
inline static uint32_t* dsc_replace_add_func(dsc_replace* dr, dsc_replace_data* drd) {
return dr->dsc.add_func(drd->name, drd->func_id, drd->length);
}
dsc::dsc(dsc_type type, uint32_t signature, uint32_t id) : type(type), signature(signature), id(id) {
}
dsc::~dsc() {
}
static size_t dsc_data_time_radix_index_func_pv_branch_mode(dsc_data_time* data, size_t index);
static size_t dsc_data_time_radix_index_func_time(dsc_data_time* data, size_t index);
static size_t dsc_data_time_radix_index_func_pv_branch_mode(dsc_data_time* data, size_t index) {
return (size_t)(ssize_t)data[index].pv_branch_mode;
}
static size_t dsc_data_time_radix_index_func_time(dsc_data_time* data, size_t index) {
return (size_t)(ssize_t)data[index].time;
}
void dsc::convert(dsc_type dst_type) {
if (type < DSC_AC101 || type > DSC_VRFL || dst_type < DSC_AC101 || dst_type > DSC_VRFL)
return;
static const dsc_func_convert dsc_convert_ac100[3][21] = {
{
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
(dsc_func_convert)0,
},
{
(dsc_func_convert)dsc_convert_to_ac100_miku_move,
(dsc_func_convert)dsc_convert_to_ac100_miku_rot,
(dsc_func_convert)dsc_convert_to_ac100_miku_disp,
(dsc_func_convert)dsc_convert_to_ac100_miku_shadow,
(dsc_func_convert)dsc_convert_to_ac100_set_motion,
(dsc_func_convert)dsc_convert_to_ac100_set_playdata,
(dsc_func_convert)dsc_convert_to_ac100_effect,
(dsc_func_convert)dsc_convert_to_ac100_eye_anim,
(dsc_func_convert)dsc_convert_to_ac100_mouth_anim,
(dsc_func_convert)dsc_convert_to_ac100_hand_anim,
(dsc_func_convert)dsc_convert_to_ac100_look_anim,
(dsc_func_convert)dsc_convert_to_ac100_expression,
(dsc_func_convert)dsc_convert_to_ac100_look_camera,
(dsc_func_convert)dsc_convert_to_ac100_lyric,
(dsc_func_convert)dsc_convert_to_ac100_mode_select,
(dsc_func_convert)dsc_convert_to_ac100_edit_motion,
(dsc_func_convert)dsc_convert_to_ac100_shadowheight,
(dsc_func_convert)dsc_convert_to_ac100_edit_face,
(dsc_func_convert)dsc_convert_to_ac100_move_camera,
(dsc_func_convert)dsc_convert_to_ac100_shadowpos,
(dsc_func_convert)dsc_convert_to_ac100_cloth_wet,
},
{
(dsc_func_convert)dsc_convert_from_ac100_miku_move,
(dsc_func_convert)dsc_convert_from_ac100_miku_rot,
(dsc_func_convert)dsc_convert_from_ac100_miku_disp,
(dsc_func_convert)dsc_convert_from_ac100_miku_shadow,
(dsc_func_convert)dsc_convert_from_ac100_set_motion,
(dsc_func_convert)dsc_convert_from_ac100_set_playdata,
(dsc_func_convert)dsc_convert_from_ac100_effect,
(dsc_func_convert)dsc_convert_from_ac100_eye_anim,
(dsc_func_convert)dsc_convert_from_ac100_mouth_anim,
(dsc_func_convert)dsc_convert_from_ac100_hand_anim,
(dsc_func_convert)dsc_convert_from_ac100_look_anim,
(dsc_func_convert)dsc_convert_from_ac100_expression,
(dsc_func_convert)dsc_convert_from_ac100_look_camera,
(dsc_func_convert)dsc_convert_from_ac100_lyric,
(dsc_func_convert)dsc_convert_from_ac100_mode_select,
(dsc_func_convert)dsc_convert_from_ac100_edit_motion,
(dsc_func_convert)dsc_convert_from_ac100_shadowheight,
(dsc_func_convert)dsc_convert_from_ac100_move_camera,
(dsc_func_convert)dsc_convert_from_ac100_edit_face,
(dsc_func_convert)dsc_convert_from_ac100_shadowpos,
(dsc_func_convert)dsc_convert_from_ac100_cloth_wet,
},
};
static const dsc_func_convert change_field_convert_func_array[2][2] = {
{
(dsc_func_convert)0,
(dsc_func_convert)dsc_convert_change_field1_to_change_field2,
},
{
(dsc_func_convert)dsc_convert_change_field2_to_change_field1,
(dsc_func_convert)0,
},
};
static const dsc_func_convert edit_camera_convert_func_array[2][2] = {
{
(dsc_func_convert)0,
(dsc_func_convert)dsc_convert_dummy,
},
{
(dsc_func_convert)dsc_convert_dummy,
(dsc_func_convert)0,
},
};
static const dsc_func_convert note_convert_func_array[3][3] = {
{
(dsc_func_convert)0,
(dsc_func_convert)dsc_convert_note7_to_note11,
(dsc_func_convert)dsc_convert_note7_to_note12,
},
{
(dsc_func_convert)dsc_convert_note11_to_note7,
(dsc_func_convert)0,
(dsc_func_convert)dsc_convert_note11_to_note12,
},
{
(dsc_func_convert)dsc_convert_note12_to_note7,
(dsc_func_convert)dsc_convert_note12_to_note11,
(dsc_func_convert)0,
},
};
static const dsc_func_convert vr_live_transform_convert_func_array[2][2] = {
{
(dsc_func_convert)0,
(dsc_func_convert)dsc_convert_dummy,
},
{
(dsc_func_convert)dsc_convert_dummy,
(dsc_func_convert)0,
},
};
bool src_has_perf_id = signature >= 0x10101514;
int32_t dsc_convert_ac100_type = src_has_perf_id ? 0 : 2;
if (dsc_convert_ac100_type == 2 && signature < 0x10000000)
signature = 0x10101514;
bool dst_has_perf_id;
switch (dst_type) {
default:
dst_has_perf_id = signature >= 0x10101514;
break;
case DSC_PSP:
case DSC_DT:
case DSC_AC101:
case DSC_AC110:
case DSC_AC120:
dst_has_perf_id = false;
dsc_convert_ac100_type = src_has_perf_id ? 1 : 0;
break;
}
if (dsc_convert_ac100_type == 1)
signature = 0;
int32_t note_convert_src;
switch (type) {
default:
note_convert_src = 0;
break;
case DSC_2ND:
note_convert_src = 1;
break;
case DSC_DT2:
case DSC_F:
note_convert_src = src_has_perf_id ? 1 : 0;
break;
case DSC_F2:
case DSC_MGF:
case DSC_X:
case DSC_VRFL:
note_convert_src = 2;
break;
}
int32_t note_convert_dst;
switch (dst_type) {
default:
note_convert_dst = 0;
break;
case DSC_2ND:
note_convert_dst = 1;
break;
case DSC_DT2:
case DSC_F:
note_convert_dst = dst_has_perf_id ? 1 : 0;
break;
case DSC_F2:
case DSC_MGF:
case DSC_X:
case DSC_VRFL:
note_convert_dst = 2;
break;
}
bool enable_edit_camera = ((note_convert_src == 0 || note_convert_src == 1)
&& (note_convert_dst == 0 || note_convert_dst == 1)
|| note_convert_src == 2 && note_convert_dst == 2);
bool enable_edit_camera_ac = (note_convert_src == 0 || note_convert_src == 1)
&& (note_convert_dst == 0 || note_convert_dst == 1) && dst_has_perf_id;
dsc_replace dr(type, dst_type, dst_has_perf_id);
int32_t src_func_count = dsc_type_get_dsc_func_count(type);
dsc_get_func_name src_get_func_name = dsc_type_get_dsc_get_func_name(type);
for (int32_t i = 0; i < src_func_count; i++) {
dsc_replace_data* repl_data = &dr.replace_data[i];
const char* src_func_name = src_get_func_name(i);
uint64_t src_func_name_hash = hash_utf8_fnv1a64m(src_func_name);
if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MIKU_MOVE"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][0];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MIKU_ROT"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][1];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MIKU_DISP"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][2];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MIKU_SHADOW"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][3];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("TARGET"))
repl_data->func = note_convert_func_array[note_convert_src][note_convert_dst];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("SET_MOTION"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][4];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("SET_PLAYDATA"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][5];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("EFFECT"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][6];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("CHANGE_FIELD"))
repl_data->func = change_field_convert_func_array
[note_convert_src == 2 ? 1 : 0][note_convert_dst == 2 ? 1 : 0];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("EYE_ANIM"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][7];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MOUTH_ANIM"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][8];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("HAND_ANIM"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][9];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("LOOK_ANIM"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][10];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("EXPRESSION"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][11];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("LOOK_CAMERA"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][12];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("LYRIC"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][13];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MODE_SELECT"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][14];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("EDIT_MOTION"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][15];
else if (dr.bar_time_set_func_id == -1
&& src_func_name_hash == hash_utf8_fnv1a64m("BAR_TIME_SET"))
dr.bar_time_set_func_id = i;
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("SHADOWHEIGHT"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][16];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("EDIT_FACE"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][17];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("MOVE_CAMERA"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][18];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("SHADOWPOS"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][19];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("CLOTH_WET"))
repl_data->func = dsc_convert_ac100[dsc_convert_ac100_type][20];
else if (dr.target_flying_time_func_id == -1
&& src_func_name_hash == hash_utf8_fnv1a64m("TARGET_FLYING_TIME"))
dr.target_flying_time_func_id = i;
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("EDIT_CAMERA"))
repl_data->func = edit_camera_convert_func_array
[note_convert_src == 2 ? 1 : 0][note_convert_dst == 2 ? 1 : 0];
else if (!repl_data->func && src_func_name_hash == hash_utf8_fnv1a64m("VR_LIVE_TRANSFORM"))
repl_data->func = vr_live_transform_convert_func_array
[type == DSC_VRFL][dst_type == DSC_VRFL];
}
for (dsc_data& i : data) {
int32_t func = i.func;
if (func == -1 || dr.replace_data[func].func_id == -1)
continue;
uint32_t* data = get_func_data(&i);
dsc_replace_data* repl_data = &dr.replace_data[func];
if (func == dr.bar_time_set_func_id) {
dr.bpm = data[0];
dr.time_signature = data[1];
dr.target_flying_time = -1000;
uint32_t* bar_time_set = dsc_replace_add_func(&dr, repl_data);
*bar_time_set++ = dr.bpm;
*bar_time_set++ = dr.time_signature;
}
else if (func == dr.target_flying_time_func_id) {
dr.target_flying_time = data[0];
uint32_t* target_flying_time = dsc_replace_add_func(&dr, repl_data);
*target_flying_time++ = dr.target_flying_time;
}
else if (dr.replace_data[func].func)
dr.replace_data[func].func(&dr, repl_data, data);
else {
uint32_t* dst_data = dsc_replace_add_func(&dr, repl_data);
memmove(dst_data, data, sizeof(uint32_t) * repl_data->length);
}
}
data.clear();
data.shrink_to_fit();
data_buffer.clear();
data_buffer.shrink_to_fit();
type = dr.dst_type;
switch (type) {
case DSC_F:
if (signature >= 0x10000000)
signature = 0x12020220;
break;
case DSC_F2:
case DSC_MGF:
case DSC_X:
case DSC_VRFL:
signature = 0x13120420;
id = 0;
break;
}
data = dr.dsc.data;
data_buffer = dr.dsc.data_buffer;
}
void dsc::rebuild() {
dsc_get_func_id get_func_id = dsc_type_get_dsc_get_func_id(type);
dsc_get_func_length get_func_length = get_dsc_get_func_length();
dsc_get_func_name get_func_name = dsc_type_get_dsc_get_func_name(type);
int32_t time_func_id = get_func_id("TIME");
int32_t pv_branch_mode_func_id = get_func_id("PV_BRANCH_MODE");
const char* time_func_name = get_func_name(time_func_id);
const char* pv_branch_mode_func_name = get_func_name(pv_branch_mode_func_id);
int32_t time_func_length = get_func_length(time_func_id);
int32_t pv_branch_mode_func_length = get_func_length(pv_branch_mode_func_id);
size_t func_count = data.size();
size_t size = 0;
for (dsc_data& j : data)
if (j.func == time_func_id || j.func == pv_branch_mode_func_id)
func_count--;
else
size += get_func_length(j.func);
std::vector<dsc_data_time> data_time;
std::vector<uint32_t> data_time_buffer;
data_time.reserve(func_count);
data_time_buffer.reserve(size);
int32_t time = -1;
int32_t pv_branch_mode = 0;
for (dsc_data& j : data) {
if (j.func == time_func_id) {
time = (int32_t)get_func_data(&j)[0];
continue;
}
else if (j.func == pv_branch_mode_func_id) {
pv_branch_mode = (int32_t)get_func_data(&j)[0];
continue;
}
dsc_data_time dsc_d;
dsc_d.time = time;
dsc_d.pv_branch_mode = pv_branch_mode;
dsc_d.name = j.name;
dsc_d.func = j.func;
dsc_d.data_offset = (uint32_t)data_time_buffer.size();
data_time.push_back(dsc_d);
uint32_t* func_data = get_func_data(&j);
int32_t func_length = get_func_length(j.func);
data_time_buffer.resize((size_t)dsc_d.data_offset + func_length);
memmove(data_time_buffer.data() + dsc_d.data_offset, func_data, sizeof(uint32_t) * func_length);
}
if (data_time.size()) {
for (dsc_data_time& i : data_time)
i.time = radix_preprocess_int32_t(i.time);
radix_sort_custom(data_time.data(), data_time.size(), sizeof(dsc_data_time),
sizeof(int32_t), (radix_index_func)dsc_data_time_radix_index_func_time);
for (dsc_data_time& i : data_time)
i.time = radix_postprocess_int32_t(i.time);
}
func_count = data_time.size();
size = 0;
time = -1;
int32_t time_count = 0;
for (dsc_data_time& i : data_time)
if (time != i.time) {
if (time_count > 1)
radix_sort_custom(&i - time_count, time_count, sizeof(dsc_data_time),
sizeof(int32_t), (radix_index_func)dsc_data_time_radix_index_func_pv_branch_mode);
time = i.time;
time_count = 1;
func_count++;
size++;
}
else
time_count++;
if (time_count > 1)
radix_sort_custom(&(data_time.end() - time_count)[0], time_count, sizeof(dsc_data_time),
sizeof(int32_t), (radix_index_func)dsc_data_time_radix_index_func_pv_branch_mode);
pv_branch_mode = -1;
int32_t pv_branch_mode_count = 0;
for (dsc_data_time& i : data_time)
if (pv_branch_mode != i.pv_branch_mode) {
pv_branch_mode = i.pv_branch_mode;
pv_branch_mode_count = 1;
func_count++;
size++;
}
else
pv_branch_mode_count++;
for (dsc_data_time& i : data_time)
size += get_func_length(i.func);
data.clear();
data_buffer.clear();
data.reserve(func_count);
data_buffer.reserve(size);
time = -1;
pv_branch_mode = -1;
for (dsc_data_time& i : data_time) {
if (time_func_id != -1 && time != i.time) {
time = i.time;
dsc_data dsc_d;
dsc_d.name = time_func_name;
dsc_d.func = time_func_id;
dsc_d.data_offset = (uint32_t)data_buffer.size();
data.push_back(dsc_d);
data_buffer.push_back(time);
}
if (pv_branch_mode_func_id != -1 && pv_branch_mode != i.pv_branch_mode) {
pv_branch_mode = i.pv_branch_mode;
dsc_data dsc_d;
dsc_d.name = pv_branch_mode_func_name;
dsc_d.func = pv_branch_mode_func_id;
dsc_d.data_offset = (uint32_t)data_buffer.size();
data.push_back(dsc_d);
data_buffer.push_back(pv_branch_mode);
}
uint32_t* data = add_func(get_func_name(i.func),
i.func, get_func_length(i.func));
memmove(data, data_time_buffer.data() + i.data_offset,
sizeof(uint32_t) * get_func_length(i.func));
}
}
dsc_get_func_length dsc::get_dsc_get_func_length() {
return dsc_type_get_dsc_get_func_length(type, signature >= 0x10101514);
}
uint32_t* dsc::get_func_data(dsc_data* data) {
return (uint32_t*)(data_buffer.data() + data->data_offset);
}
void dsc::merge(int32_t count, ...) {
va_list args;
va_start(args, count);
dsc* s0 = va_arg(args, dsc*);
if (!s0) {
va_end(args);
return;
}
for (int32_t i = 1; i < count; i++) {
dsc* d1 = va_arg(args, dsc*);
if (!d1 || s0->type != d1->type || s0->signature != d1->signature) {
va_end(args);
return;
}
}
va_end(args);
type = s0->type;
signature = s0->signature;
id = s0->id;
dsc_get_func_id get_func_id = dsc_type_get_dsc_get_func_id(s0->type);
dsc_get_func_length get_func_length = s0->get_dsc_get_func_length();
dsc_get_func_name get_func_name = dsc_type_get_dsc_get_func_name(s0->type);
int32_t time_func_id = get_func_id("TIME");
int32_t pv_branch_mode_func_id = get_func_id("PV_BRANCH_MODE");
const char* time_func_name = get_func_name(time_func_id);
const char* pv_branch_mode_func_name = get_func_name(pv_branch_mode_func_id);
int32_t time_func_length = get_func_length(time_func_id);
int32_t pv_branch_mode_func_length = get_func_length(pv_branch_mode_func_id);
size_t func_count = 0;
size_t size = 0;
va_start(args, count);
for (int32_t i = 0; i < count; i++) {
dsc* s = va_arg(args, dsc*);
func_count += s->data.size();
for (dsc_data& j : s->data)
if (j.func == time_func_id || j.func == pv_branch_mode_func_id)
func_count--;
else
size += get_func_length(j.func);
}
va_end(args);
std::vector<dsc_data_time> data_time;
std::vector<uint32_t> data_time_buffer;
data_time.reserve(func_count);
data_time_buffer.reserve(size);
va_start(args, count);
for (int32_t i = 0; i < count; i++) {
dsc* s = va_arg(args, dsc*);
int32_t time = -1;
int32_t pv_branch_mode = 0;
for (dsc_data& j : s->data) {
if (j.func == time_func_id) {
time = (int32_t)s->get_func_data(&j)[0];
continue;
}
else if (j.func == pv_branch_mode_func_id) {
pv_branch_mode = (int32_t)s->get_func_data(&j)[0];
continue;
}
dsc_data_time dsc_d;
dsc_d.time = time;
dsc_d.pv_branch_mode = pv_branch_mode;
dsc_d.name = j.name;
dsc_d.func = j.func;
dsc_d.data_offset = (uint32_t)data_time_buffer.size();
data_time.push_back(dsc_d);
uint32_t* func_data = s->get_func_data(&j);
int32_t func_length = get_func_length(j.func);
data_time_buffer.resize((size_t)dsc_d.data_offset + func_length);
memmove(data_time_buffer.data() + dsc_d.data_offset, func_data, sizeof(uint32_t) * func_length);
}
}
va_end(args);
if (data_time.size()) {
for (dsc_data_time& i : data_time)
i.time = radix_preprocess_int32_t(i.time);
radix_sort_custom(data_time.data(), data_time.size(), sizeof(dsc_data_time),
sizeof(int32_t), (radix_index_func)dsc_data_time_radix_index_func_time);
for (dsc_data_time& i : data_time)
i.time = radix_postprocess_int32_t(i.time);
}
func_count = data_time.size();
size = 0;
int32_t time = -1;
int32_t time_count = 0;
for (dsc_data_time& i : data_time)
if (time != i.time) {
if (time_count > 1)
radix_sort_custom(&i - time_count, time_count, sizeof(dsc_data_time),
sizeof(int32_t), (radix_index_func)dsc_data_time_radix_index_func_pv_branch_mode);
time = i.time;
time_count = 1;
func_count++;
size++;
}
else
time_count++;
if (time_count > 1)
radix_sort_custom(&(data_time.end() - time_count)[0], time_count, sizeof(dsc_data_time),
sizeof(int32_t), (radix_index_func)dsc_data_time_radix_index_func_pv_branch_mode);
int32_t pv_branch_mode = -1;
int32_t pv_branch_mode_count = 0;
for (dsc_data_time& i : data_time)
if (pv_branch_mode != i.pv_branch_mode) {
pv_branch_mode = i.pv_branch_mode;
pv_branch_mode_count = 1;
func_count++;
size++;
}
else
pv_branch_mode_count++;
for (dsc_data_time& i : data_time)
size += get_func_length(i.func);
data.clear();
data_buffer.clear();
data.reserve(func_count);
data_buffer.reserve(size);
time = -1;
pv_branch_mode = -1;
for (dsc_data_time& i : data_time) {
if (time_func_id != -1 && time != i.time) {
time = i.time;
dsc_data dsc_d;
dsc_d.name = time_func_name;
dsc_d.func = time_func_id;
dsc_d.data_offset = (uint32_t)data_buffer.size();
data.push_back(dsc_d);
data_buffer.push_back(time);
}
if (pv_branch_mode_func_id != -1 && pv_branch_mode != i.pv_branch_mode) {
pv_branch_mode = i.pv_branch_mode;
dsc_data dsc_d;
dsc_d.name = pv_branch_mode_func_name;
dsc_d.func = pv_branch_mode_func_id;
dsc_d.data_offset = (uint32_t)data_buffer.size();
data.push_back(dsc_d);
data_buffer.push_back(pv_branch_mode);
}
uint32_t* data = add_func(get_func_name(i.func),
i.func, get_func_length(i.func));
memmove(data, data_time_buffer.data() + i.data_offset,
sizeof(uint32_t) * get_func_length(i.func));
}
}
bool dsc::parse(void* data, size_t size, dsc_type type) {
if (!data || !(size / 4) || type < DSC_AC101 || type > DSC_VRFL)
return false;
uint32_t* data_dsc = (uint32_t*)data;
f2_struct st;
signature = 0;
switch (type) {
default:
if (*data_dsc >= 0x10000000) {
signature = *data_dsc++;
size--;
}
break;
case DSC_F:
if (*data_dsc >= 0x10000000) {
if (*data_dsc != 0x12020220)
return false;
data_dsc++;
signature = 0x12020220;
}
break;
case DSC_F2:
case DSC_MGF:
case DSC_X:
case DSC_VRFL:
st.read(data, size);
data_dsc = (uint32_t*)st.data.data();
if (st.header.use_big_endian)
for (size_t i = size / 4; i; i--, data_dsc++)
*data_dsc = load_reverse_endianness_uint32_t(data_dsc);
data_dsc = (uint32_t*)st.data.data();
if (*data_dsc++ != 0x13120420) {
return false;
}
signature = 0x13120420;
id = *data_dsc++;
break;
}
size /= 4;
this->type = type;
dsc_get_func_name get_func_name = dsc_type_get_dsc_get_func_name(type);
dsc_get_func_length get_func_length = get_dsc_get_func_length();
size_t func_count = 0;
size_t data_size = 0;
uint32_t* func_data = data_dsc;
for (size_t i = 0; i < size; i++) {
if (!*func_data) {
size = i;
break;
}
int32_t func_length = get_func_length(*func_data++);
if (func_length < 0) {
size = i;
break;
}
data_size += func_length;
func_data += func_length;
i += func_length;
func_count++;
}
this->data.reserve(func_count);
data_buffer.reserve(data_size);
func_data = data_dsc;
for (size_t i = 0; i < func_count; i++) {
dsc_data data;
data.name = get_func_name(*func_data);
data.func = *func_data++;
data.data_offset = (uint32_t)data_buffer.size();
this->data.push_back(data);
int32_t func_length = get_func_length(data.func);
data_buffer.resize((size_t)data.data_offset + func_length);
memmove(data_buffer.data() + data.data_offset, func_data, sizeof(uint32_t) * func_length);
func_data += func_length;
}
return true;
}
void dsc::unparse(void** data, size_t* size) {
if (!data || !size)
return;
dsc_get_func_length get_func_length = get_dsc_get_func_length();
bool f2 = false;
size_t s = 1;
switch (type) {
default:
if (signature >= 0x10000000)
s++;
break;
case DSC_F2:
case DSC_MGF:
case DSC_X:
case DSC_VRFL:
s += 2;
f2 = true;
break;
}
for (dsc_data& i : this->data)
s += get_func_length(i.func) + 1ULL;
size_t data_size = s;
if (f2)
data_size = align_val(s, 4);
f2_struct st;
uint32_t* data_dsc;
if (f2) {
st.data.resize(data_size * sizeof(uint32_t));
data_dsc = (uint32_t*)st.data.data();
}
else
data_dsc = force_malloc_s(uint32_t, data_size);
uint32_t* func_data = data_dsc;
switch (type) {
default:
if (signature >= 0x10000000)
*func_data++ = signature;
break;
case DSC_F:
if (signature >= 0x10000000)
*func_data++ = 0x12020220;
break;
case DSC_F2:
case DSC_MGF:
case DSC_X:
case DSC_VRFL:
*func_data++ = 0x13120420;
*func_data++ = id;
break;
}
for (dsc_data& i : this->data) {
*func_data++ = i.func;
uint32_t* data = this->get_func_data(&i);
for (int32_t j = get_func_length(i.func); j; j--)
*func_data++ = *data++;
}
*func_data++ = 0;
if (f2) {
enrs e;
enrs_entry ee;
ee = { 0, 1, 4, (uint32_t)s };
ee.append(0, 1, ENRS_DWORD);
e.vec.push_back(ee);
st.enrs = e;
st.header.signature = reverse_endianness_uint32_t('PVSC');
st.header.length = 0x40;
st.header.use_section_size = true;
st.header.inner_signature = 0x13120420;
st.write(data, size, true, false);
}
else {
*data = data_dsc;
*size = data_size * sizeof(uint32_t);
}
}
int32_t dsc::calculate_target_flying_time(int32_t bpm, int32_t time_signature) {
return (int32_t)((float_t)time_signature * (60.0f / (float_t)bpm) * 1000.0f);
}
bool dsc::load_file(void* data, const char* path, const char* file, uint32_t hash) {
std::string s = path + std::string(file);
stream dsc_s;
io_open(&dsc_s, s.c_str(), "rb");
void* dsc_data = force_malloc(dsc_s.length);
size_t dsc_length = dsc_s.length;
io_read(&dsc_s, dsc_data, dsc_length);
dsc* d = (dsc*)data;
bool ret = d->parse(dsc_data, dsc_length, d->type);
io_free(&dsc_s);
free(dsc_data);
return ret;
}
dsc_replace::dsc_replace(dsc_type src_type, dsc_type dst_type,
bool dst_has_perf_id) : src_type(DSC_FT), dst_type(DSC_FT), replace_data() {
bpm = 120;
time_signature = 3;
target_flying_time = -1000;
bar_time_set_func_id = -1;
target_flying_time_func_id = -1;
this->dst_has_perf_id = dst_has_perf_id;
if (src_type < DSC_AC101 || src_type > DSC_VRFL
|| dst_type < DSC_AC101 || dst_type > DSC_VRFL)
return;
this->src_type = src_type;
this->dst_type = dst_type;
this->replace_data = 0;
int32_t src_func_count = dsc_type_get_dsc_func_count(src_type);
int32_t dst_func_count = dsc_type_get_dsc_func_count(dst_type);
dsc_get_func_name src_get_func_name = dsc_type_get_dsc_get_func_name(src_type);
dsc_get_func_name dst_get_func_name = dsc_type_get_dsc_get_func_name(dst_type);
dsc_get_func_length dst_get_func_length = dsc_type_get_dsc_get_func_length(dst_type, dst_has_perf_id);
dsc_replace_data* replace_data = force_malloc_s(dsc_replace_data, src_func_count);
this->replace_data = replace_data;
for (int32_t i = 0; i < src_func_count; i++) {
replace_data->name = 0;
replace_data->func_id = -1;
replace_data->length = 0;
replace_data->func = 0;
const char* src_func_name = src_get_func_name(i);
if (src_func_name && src_func_name[0]) {
uint64_t src_func_name_hash = hash_utf8_fnv1a64m(src_func_name);
for (int32_t j = 0; j < dst_func_count; j++)
if (src_func_name_hash == hash_utf8_fnv1a64m(dst_get_func_name(j))) {
replace_data->name = src_func_name;
replace_data->func_id = j;
replace_data->length = dst_get_func_length(j);
break;
}
}
replace_data++;
}
}
dsc_replace::~dsc_replace() {
}