diff --git a/app/src/main/cpp/GakumasLocalify/Hook.cpp b/app/src/main/cpp/GakumasLocalify/Hook.cpp index 7741a72..e76a65b 100644 --- a/app/src/main/cpp/GakumasLocalify/Hook.cpp +++ b/app/src/main/cpp/GakumasLocalify/Hook.cpp @@ -711,6 +711,9 @@ namespace GakumasLocal::HookMain { static auto limitInfo_field = ActorSwingBreastBone_klass->Get("limitInfo"); static auto limitInfo_useLimit_field = LimitInfo_klass->Get("useLimit"); + static auto limitInfo_axisX_field = LimitInfo_klass->Get("axisX"); + static auto limitInfo_axisY_field = LimitInfo_klass->Get("axisY"); + static auto limitInfo_axisZ_field = LimitInfo_klass->Get("axisZ"); auto swingBreastBones = Il2cppUtils::ClassGetFieldValue *>(initializeData, Data_swingBreastBones_field); @@ -749,8 +752,26 @@ namespace GakumasLocal::HookMain { Log::DebugFmt("orig bone: damping: %f, stiffness: %f, spring: %f, pendulum: %f, " "pendulumRange: %f, average: %f, rootWeight: %f, useLimit: %d, useArmCorrection: %d, isDirty: %d", damping, stiffness, spring, pendulum, pendulumRange, average, rootWeight, useLimit, useArmCorrection, isDirty); + if (!Config::bUseLimit) { + Il2cppUtils::ClassSetFieldValue(limitInfo, limitInfo_useLimit_field, 0); + } + else { + Il2cppUtils::ClassSetFieldValue(limitInfo, limitInfo_useLimit_field, 1); + auto axisX = Il2cppUtils::ClassGetFieldValue(limitInfo, limitInfo_axisX_field); + auto axisY = Il2cppUtils::ClassGetFieldValue(limitInfo, limitInfo_axisY_field); + auto axisZ = Il2cppUtils::ClassGetFieldValue(limitInfo, limitInfo_axisZ_field); + axisX.m_X *= Config::bLimitXx; + axisX.m_Y *= Config::bLimitXy; + axisY.m_X *= Config::bLimitYx; + axisY.m_Y *= Config::bLimitYy; + axisZ.m_X *= Config::bLimitZx; + axisZ.m_Y *= Config::bLimitZy; + Il2cppUtils::ClassSetFieldValue(limitInfo, limitInfo_axisX_field, axisX); + Il2cppUtils::ClassSetFieldValue(limitInfo, limitInfo_axisY_field, axisY); + Il2cppUtils::ClassSetFieldValue(limitInfo, limitInfo_axisZ_field, axisZ); + + } - Il2cppUtils::ClassSetFieldValue(limitInfo, limitInfo_useLimit_field, Config::bUseLimit); Il2cppUtils::ClassSetFieldValue(bone, damping_field, Config::bDamping); Il2cppUtils::ClassSetFieldValue(bone, stiffness_field, Config::bStiffness); Il2cppUtils::ClassSetFieldValue(bone, spring_field, Config::bSpring); diff --git a/app/src/main/cpp/GakumasLocalify/config/Config.cpp b/app/src/main/cpp/GakumasLocalify/config/Config.cpp index c98987d..53f4e79 100644 --- a/app/src/main/cpp/GakumasLocalify/config/Config.cpp +++ b/app/src/main/cpp/GakumasLocalify/config/Config.cpp @@ -28,7 +28,6 @@ namespace GakumasLocal::Config { int lodQualityLevel = 4; bool enableBreastParam = false; - int bUseLimit = 1; float bDamping = 0.33f; float bStiffness = 0.08f; float bSpring = 1.0f; @@ -39,6 +38,13 @@ namespace GakumasLocal::Config { bool bUseArmCorrection = true; bool bUseScale = false; float bScale = 1.0f; + bool bUseLimit = true; + float bLimitXx = 1.0f; + float bLimitXy = 1.0f; + float bLimitYx = 1.0f; + float bLimitYy = 1.0f; + float bLimitZx = 1.0f; + float bLimitZy = 1.0f; void LoadConfig(const std::string& configStr) { try { @@ -66,7 +72,6 @@ namespace GakumasLocal::Config { GetConfigItem(reflectionQualityLevel); GetConfigItem(lodQualityLevel); GetConfigItem(enableBreastParam); - GetConfigItem(bUseLimit); GetConfigItem(bDamping); GetConfigItem(bStiffness); GetConfigItem(bSpring); @@ -77,6 +82,13 @@ namespace GakumasLocal::Config { GetConfigItem(bUseArmCorrection); GetConfigItem(bUseScale); GetConfigItem(bScale); + GetConfigItem(bUseLimit); + GetConfigItem(bLimitXx); + GetConfigItem(bLimitXy); + GetConfigItem(bLimitYx); + GetConfigItem(bLimitYy); + GetConfigItem(bLimitZx); + GetConfigItem(bLimitZy); } catch (std::exception& e) { diff --git a/app/src/main/cpp/GakumasLocalify/config/Config.hpp b/app/src/main/cpp/GakumasLocalify/config/Config.hpp index 728be5b..127cf30 100644 --- a/app/src/main/cpp/GakumasLocalify/config/Config.hpp +++ b/app/src/main/cpp/GakumasLocalify/config/Config.hpp @@ -27,7 +27,6 @@ namespace GakumasLocal::Config { extern int lodQualityLevel; extern bool enableBreastParam; - extern int bUseLimit; extern float bDamping; extern float bStiffness; extern float bSpring; @@ -38,6 +37,13 @@ namespace GakumasLocal::Config { extern bool bUseArmCorrection; extern bool bUseScale; extern float bScale; + extern bool bUseLimit; + extern float bLimitXx; + extern float bLimitXy; + extern float bLimitYx; + extern float bLimitYy; + extern float bLimitZx; + extern float bLimitZy; void LoadConfig(const std::string& configStr); } diff --git a/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp b/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp index d199bf5..e49b779 100644 --- a/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp +++ b/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp @@ -983,7 +983,75 @@ public: auto operator ==(const Vector2 x) const -> bool { return this->x == x.x && this->y == x.y; } }; - struct Vector4 { + struct Vector2Int { + int m_X, m_Y; + + Vector2Int() { m_X = m_Y = 0; } + + Vector2Int(const int f1, const int f2) { + m_X = f1; + m_Y = f2; + } + + [[nodiscard]] auto Distance(const Vector2Int& event) const -> float { + const auto dx = this->m_X - event.m_X; + const auto dy = this->m_Y - event.m_Y; + return std::sqrt(dx * dx + dy * dy); + } + + auto operator*(const int x) -> Vector2Int { + this->m_X *= x; + this->m_Y *= x; + return *this; + } + + auto operator/(const int x) -> Vector2Int { + this->m_X /= x; + this->m_Y /= x; + return *this; + } + + auto operator+(const int x) -> Vector2Int { + this->m_X += x; + this->m_Y += x; + return *this; + } + + auto operator-(const int x) -> Vector2Int { + this->m_X -= x; + this->m_Y -= x; + return *this; + } + + auto operator*(const Vector2Int x) -> Vector2Int { + this->m_X *= x.m_X; + this->m_Y *= x.m_Y; + return *this; + } + + auto operator-(const Vector2Int x) -> Vector2Int { + this->m_X -= x.m_X; + this->m_Y -= x.m_Y; + return *this; + } + + auto operator+(const Vector2Int x) -> Vector2Int { + this->m_X += x.m_X; + this->m_Y += x.m_Y; + return *this; + } + + auto operator/(const Vector2Int x) -> Vector2Int { + this->m_X /= x.m_X; + this->m_Y /= x.m_Y; + return *this; + } + + auto operator ==(const Vector2Int x) const -> bool { return this->m_X == x.m_X && this->m_Y == x.m_Y; } + }; + + + struct Vector4 { float x, y, z, w; Vector4() { x = y = z = w = 0.F; } diff --git a/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt b/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt index a6be571..38560e5 100644 --- a/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt +++ b/app/src/main/java/io/github/chinosk/gakumas/localify/ConfigUpdateListener.kt @@ -34,7 +34,13 @@ interface ConfigListener { fun onBPendulumRangeChanged(s: CharSequence, start: Int, before: Int, count: Int) fun onBAverageChanged(s: CharSequence, start: Int, before: Int, count: Int) fun onBRootWeightChanged(s: CharSequence, start: Int, before: Int, count: Int) - fun onBUseLimitChanged(s: CharSequence, start: Int, before: Int, count: Int) + fun onBUseLimitChanged(value: Boolean) + fun onBLimitXxChanged(s: CharSequence, start: Int, before: Int, count: Int) + fun onBLimitXyChanged(s: CharSequence, start: Int, before: Int, count: Int) + fun onBLimitYxChanged(s: CharSequence, start: Int, before: Int, count: Int) + fun onBLimitYyChanged(s: CharSequence, start: Int, before: Int, count: Int) + fun onBLimitZxChanged(s: CharSequence, start: Int, before: Int, count: Int) + fun onBLimitZyChanged(s: CharSequence, start: Int, before: Int, count: Int) fun onBScaleChanged(s: CharSequence, start: Int, before: Int, count: Int) fun onBUseArmCorrectionChanged(value: Boolean) fun onBUseScaleChanged(value: Boolean) @@ -325,17 +331,74 @@ interface ConfigUpdateListener: ConfigListener { saveConfig() } - override fun onBUseLimitChanged(s: CharSequence, start: Int, before: Int, count: Int){ - binding.config!!.bUseLimit = try { - s.toString().toInt() + override fun onBUseLimitChanged(value: Boolean){ + binding.config!!.bUseLimit = value + saveConfig() + checkConfigAndUpdateView() + } + + override fun onBLimitXxChanged(s: CharSequence, start: Int, before: Int, count: Int) { + binding.config!!.bLimitXx = try { + s.toString().toFloat() } catch (e: Exception) { - 0 + 0f } saveConfig() } - override fun onBScaleChanged(s: CharSequence, start: Int, before: Int, count: Int){ + override fun onBLimitXyChanged(s: CharSequence, start: Int, before: Int, count: Int) { + binding.config!!.bLimitXy = try { + s.toString().toFloat() + } + catch (e: Exception) { + 0f + } + saveConfig() + } + + override fun onBLimitYxChanged(s: CharSequence, start: Int, before: Int, count: Int) { + binding.config!!.bLimitYx = try { + s.toString().toFloat() + } + catch (e: Exception) { + 0f + } + saveConfig() + } + + override fun onBLimitYyChanged(s: CharSequence, start: Int, before: Int, count: Int) { + binding.config!!.bLimitYy = try { + s.toString().toFloat() + } + catch (e: Exception) { + 0f + } + saveConfig() + } + + override fun onBLimitZxChanged(s: CharSequence, start: Int, before: Int, count: Int) { + binding.config!!.bLimitZx = try { + s.toString().toFloat() + } + catch (e: Exception) { + 0f + } + saveConfig() + } + + override fun onBLimitZyChanged(s: CharSequence, start: Int, before: Int, count: Int) { + binding.config!!.bLimitZy = try { + s.toString().toFloat() + } + catch (e: Exception) { + 0f + } + saveConfig() + } + + + override fun onBScaleChanged(s: CharSequence, start: Int, before: Int, count: Int) { binding.config!!.bScale = try { s.toString().toFloat() } @@ -344,18 +407,26 @@ interface ConfigUpdateListener: ConfigListener { } saveConfig() } + override fun onBClickPresetChanged(index: Int) { val setData: FloatArray = when (index) { // 0.33, 0.08, 0.7, 0.12, 0.25, 0.2, 0.8, 0, noUseArm 啥玩意 - 0 -> floatArrayOf(0.33f, 0.07f, 0.7f, 0.06f, 0.25f, 0.2f, 0.5f, 1f) - 1 -> floatArrayOf(0.365f, 0.06f, 0.62f, 0.07f, 0.25f, 0.2f, 0.5f, 1f) - 2 -> floatArrayOf(0.4f, 0.065f, 0.55f, 0.075f, 0.25f, 0.2f, 0.5f, 1f) - 3 -> floatArrayOf(0.4f, 0.065f, 0.55f, 0.075f, 0.25f, 0.2f, 0.5f, 0f) - 4 -> floatArrayOf(0.4f, 0.06f, 0.4f, 0.075f, 0.55f, 0.2f, 0.8f, 0f) + 0 -> floatArrayOf(0.33f, 0.07f, 0.7f, 0.06f, 0.25f, 0.2f, 0.5f, + 1f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f) + 1 -> floatArrayOf(0.365f, 0.06f, 0.62f, 0.07f, 0.25f, 0.2f, 0.5f, + 1f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f) + 2 -> floatArrayOf(0.4f, 0.065f, 0.55f, 0.075f, 0.25f, 0.2f, 0.5f, + 1f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f) + 3 -> floatArrayOf(0.4f, 0.065f, 0.55f, 0.075f, 0.25f, 0.2f, 0.5f, + 1f, 4.0f, 4.0f, 4.0f, 4.0f, 4.0f, 3.0f) + 4 -> floatArrayOf(0.4f, 0.06f, 0.4f, 0.075f, 0.55f, 0.2f, 0.8f, + 1f, 6.0f, 6.0f, 6.0f, 6.0f, 6.0f, 3.5f) - 5 -> floatArrayOf(0.33f, 0.08f, 0.8f, 0.12f, 0.55f, 0.2f, 1.0f, 0f) + 5 -> floatArrayOf(0.33f, 0.08f, 0.8f, 0.12f, 0.55f, 0.2f, 1.0f, + 0f) - else -> floatArrayOf(0.33f, 0.08f, 1.0f, 0.055f, 0.15f, 0.2f, 0.5f, 1f) + else -> floatArrayOf(0.33f, 0.08f, 1.0f, 0.055f, 0.15f, 0.2f, 0.5f, + 1f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f) } binding.config!!.bDamping = setData[0] @@ -365,7 +436,19 @@ interface ConfigUpdateListener: ConfigListener { binding.config!!.bPendulumRange = setData[4] binding.config!!.bAverage = setData[5] binding.config!!.bRootWeight = setData[6] - binding.config!!.bUseLimit = setData[7].toInt() + binding.config!!.bUseLimit = if (setData[7] == 0f) { + false + } + else { + binding.config!!.bLimitXx = setData[8] + binding.config!!.bLimitXy = setData[9] + binding.config!!.bLimitYx = setData[10] + binding.config!!.bLimitYy = setData[11] + binding.config!!.bLimitZx = setData[12] + binding.config!!.bLimitZy = setData[13] + true + } + binding.config!!.bUseArmCorrection = true checkConfigAndUpdateView() diff --git a/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt b/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt index 2a621ed..f78a7e9 100644 --- a/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt +++ b/app/src/main/java/io/github/chinosk/gakumas/localify/models/GakumasConfig.kt @@ -24,7 +24,6 @@ data class GakumasConfig ( var lodQualityLevel: Int = 4, // 0~5 var enableBreastParam: Boolean = false, - var bUseLimit: Int = 1, var bDamping: Float = 0.33f, var bStiffness: Float = 0.08f, var bSpring: Float = 1.0f, @@ -34,5 +33,12 @@ data class GakumasConfig ( var bRootWeight: Float = 0.5f, var bUseArmCorrection: Boolean = true, var bUseScale: Boolean = false, - var bScale: Float = 1.0f + var bScale: Float = 1.0f, + var bUseLimit: Boolean = true, + var bLimitXx: Float = 1.0f, + var bLimitXy: Float = 1.0f, + var bLimitYx: Float = 1.0f, + var bLimitYy: Float = 1.0f, + var bLimitZx: Float = 1.0f, + var bLimitZy: Float = 1.0f, ) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1ee491c..63238cf 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -848,7 +848,7 @@ + android:weightSum="1"> - - - - - - - - @@ -962,6 +939,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6d1b1cf..8ba0160 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -31,9 +31,16 @@ 钟摆范围 (PendulumRange) Average RootWeight - 限制范围 (0/1) + 范围限制倍率 (0 为不限制, 1 为原版) 使用手臂矫正 IsDirty 应用缩放 胸部缩放倍率 + 启用范围限制倍率 + axisX.x + axisY.x + axisZ.x + axisX.y + axisY.y + axisZ.y \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b96685..c5a5203 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,10 +31,17 @@ Pendulum Range Average Root Weight - Use Limit (0/1) + Limit Range Multiplier (0 is Unlimited) Use Arm Correction IsDirty Use Breast Scale Breast Scale + Use Limit Multiplier + axisX.x + axisY.x + axisZ.x + axisX.y + axisY.y + axisZ.y \ No newline at end of file