diff --git a/GameData/TweakScale/plugins/Scale.dll b/GameData/TweakScale/plugins/Scale.dll index 035bf637..7d990102 100755 Binary files a/GameData/TweakScale/plugins/Scale.dll and b/GameData/TweakScale/plugins/Scale.dll differ diff --git a/Scale.cs b/Scale.cs index f3c80bbe..47b1298d 100644 --- a/Scale.cs +++ b/Scale.cs @@ -673,16 +673,12 @@ public float GetModuleMass(float defaultMass) if (_setupRun && IsRescaled()) { // todo: optimierung falls das auch in flight drankommt - var scalMode = ScaleType.Exponents["Part"]._exponents["mass"]; - var multBy = ScaleType.Exponents["Part"].getMultFactor("mass", scalMode, ScalingFactor); - return multBy-1; + return ScaleType.Exponents["Part"].getMassDelta(_prefabPart.mass, ScalingFactor); } else - return 0; + return 0; } - - public override string ToString() { var result = "TweakScale{\n"; diff --git a/ScaleExponents.cs b/ScaleExponents.cs index e7fcae58..14f567c6 100644 --- a/ScaleExponents.cs +++ b/ScaleExponents.cs @@ -255,38 +255,45 @@ static private void Rescale(MemberUpdater current, MemberUpdater baseValue, stri } } - public float getMultFactor(string name, ScalingMode scalingMode, ScalingFactor factor) + // mass delta (ScaledMass - prefabMass) for the getModuleCost method + // -> should only be called for the "Part" node + public float getMassDelta(float prefabMass, ScalingFactor factor) { - var exponentValue = scalingMode.Exponent; + if (!_exponents.ContainsKey("mass")) + return 0; + + var exponentValue = _exponents["mass"].Exponent; var exponent = double.NaN; - double[] values = null; + if (exponentValue.Contains(',')) { if (factor.index == -1) { - Tools.LogWf("Value list used for freescale part exponent field {0}: {1}", name, exponentValue); - return 1; + Tools.LogWf("Value list used for freescale part exponent field {0}: {1}", "mass", exponentValue); + return 0; } - values = Tools.ConvertString(exponentValue, new double[] { }); + float[] values = null; + values = Tools.ConvertString(exponentValue, new float[] { }); if (values.Length <= factor.index) { - Tools.LogWf("Too few values given for {0}. Expected at least {1}, got {2}: {3}", name, factor.index + 1, values.Length, exponentValue); - return 1; + Tools.LogWf("Too few values given for {0}. Expected at least {1}, got {2}: {3}", "mass", factor.index + 1, values.Length, exponentValue); + return 0; } + + return values[factor.index] - prefabMass; } - else if (!double.TryParse(exponentValue, out exponent)) + else { - Tools.LogWf("Invalid exponent {0} for field {1}", exponentValue, name); - } - - double multiplyBy = 1; - if (!double.IsNaN(exponent)) - multiplyBy = Math.Pow(scalingMode.UseRelativeScaling ? factor.relative.linear : factor.absolute.linear, exponent); + if (!double.TryParse(exponentValue, out exponent) || double.IsNaN(exponent)) + { + Tools.LogWf("Invalid exponent {0} for field {1}", exponentValue, "mass"); + return 0; + } - return (float)multiplyBy; + return prefabMass * (float)(Math.Pow(factor.absolute.linear, exponent)-1); + } } - private bool ShouldIgnore(Part part) { return _ignores.Any(v => part.Modules.Contains(v));