diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 08e6671..89f6156 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,6 +11,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive + - name: set up android development environment uses: android-actions/setup-android@v2 @@ -18,6 +19,7 @@ jobs: run: | sdkmanager --install "cmake;3.22.1" echo "cmake.dir=/usr/local/lib/android/sdk/cmake/3.22.1" > local.properties + npm install -g pnpm - name: Setup Java JDK uses: actions/setup-java@v4.2.1 @@ -25,6 +27,18 @@ jobs: distribution: 'temurin' java-version: '21' + - name: Update Assets + run: | + git submodule foreach --recursive git pull origin main + git clone https://${{ secrets.ACCESS_TOKEN_GITHUB }}@github.com/imas-tools/gakumas-raw-txts.git app/src/main/assets/gakumas-local/gakumas-raw-txts + mv app/src/main/assets/gakumas-local/gakumas-raw-txts/Resource app/src/main/assets/gakumas-local/raw + rm -rf app/src/main/assets/gakumas-local/gakumas-raw-txts + + - name: Build Assets + run: | + mv app/src/main/assets/gakumas-local/GakumasPreTranslation/.env.sample app/src/main/assets/gakumas-local/GakumasPreTranslation/.env + cd app/src/main/assets/gakumas-local && make build-resource + - name: Write branch and commit info run: | branch=$(git rev-parse --abbrev-ref HEAD) diff --git a/app/src/main/assets/gakumas-local b/app/src/main/assets/gakumas-local index e97c861..56c568e 160000 --- a/app/src/main/assets/gakumas-local +++ b/app/src/main/assets/gakumas-local @@ -1 +1 @@ -Subproject commit e97c861d73668fdaa00c4aded70b18ead28fee02 +Subproject commit 56c568e32a84ee1351f2efcc70971b7f23d85186 diff --git a/app/src/main/cpp/GakumasLocalify/Hook.cpp b/app/src/main/cpp/GakumasLocalify/Hook.cpp index 08c182f..c538fd2 100644 --- a/app/src/main/cpp/GakumasLocalify/Hook.cpp +++ b/app/src/main/cpp/GakumasLocalify/Hook.cpp @@ -740,6 +740,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); @@ -778,8 +781,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 40108e0..dae0fcd 100644 --- a/app/src/main/cpp/GakumasLocalify/config/Config.cpp +++ b/app/src/main/cpp/GakumasLocalify/config/Config.cpp @@ -29,7 +29,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; @@ -40,6 +39,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 { @@ -68,7 +74,6 @@ namespace GakumasLocal::Config { GetConfigItem(reflectionQualityLevel); GetConfigItem(lodQualityLevel); GetConfigItem(enableBreastParam); - GetConfigItem(bUseLimit); GetConfigItem(bDamping); GetConfigItem(bStiffness); GetConfigItem(bSpring); @@ -79,6 +84,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 8a4bec9..38aaa64 100644 --- a/app/src/main/cpp/GakumasLocalify/config/Config.hpp +++ b/app/src/main/cpp/GakumasLocalify/config/Config.hpp @@ -28,7 +28,6 @@ namespace GakumasLocal::Config { extern int lodQualityLevel; extern bool enableBreastParam; - extern int bUseLimit; extern float bDamping; extern float bStiffness; extern float bSpring; @@ -39,6 +38,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 031a3f7..457fdf4 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 @@ -35,7 +35,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) @@ -332,17 +338,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() } @@ -351,18 +414,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] @@ -372,7 +443,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 beb5763..af45b52 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 @@ -25,7 +25,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, @@ -35,5 +34,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 b2217bf..fb5dd05 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -861,7 +861,7 @@ + android:weightSum="1"> - - - - - - - - @@ -975,6 +952,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1c75d80..76a9cd1 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -32,9 +32,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 6b6c102..0de9161 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,10 +32,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