Unstable v0.19.3.0

This commit is contained in:
Juan Pablo Arce
2022-09-02 15:10:56 -03:00
parent 28789616bd
commit 3f2c843247
336 changed files with 7152 additions and 7739 deletions
@@ -5,12 +5,11 @@ using System.Globalization;
using System.Linq;
using System.Xml.Linq;
using Barotrauma.Items.Components;
using Barotrauma.Networking;
// ReSharper disable ArrangeThisQualifier
namespace Barotrauma
{
internal class PropertyReference
internal sealed class PropertyReference
{
public object? OriginalValue { get; private set; }
@@ -38,87 +37,63 @@ namespace Barotrauma
/// Calculate the new value of the property
/// </summary>
/// <param name="level">level of the upgrade</param>
/// <param name="sourceElement">Optional XElement reference, only used for error logging.</param>
/// <returns></returns>
public float CalculateUpgrade(int level, XElement? sourceElement = null)
public object CalculateUpgrade(int level)
{
if (OriginalValue is float || OriginalValue is int || OriginalValue is double)
switch (OriginalValue)
{
var value = (float) OriginalValue;
if (level == 0) { return value; }
if (Multiplier[^1] != '%')
case float _:
case int _:
case double _:
{
float multiplier = ParseValue();
switch (Multiplier[0])
{
case '*':
case 'x':
return value * (multiplier * level);
case '/':
return value / (multiplier * level);
case '-':
return value - (multiplier * level);
case '+':
return value + (multiplier * level);
case '=':
return multiplier;
}
var value = (float) OriginalValue;
return level == 0 ? value : CalculateUpgrade(value, level, Multiplier);
}
else
case bool _ when bool.TryParse(Multiplier, out bool result):
{
float multiplier = UpgradePrefab.ParsePercentage(Multiplier, Name, sourceElement, upgrade.Prefab.SuppressWarnings);
return ApplyPercentage(value, multiplier, level);
return result;
}
default:
{
DebugConsole.AddWarning($"Original value of \"{Name}\" in the upgrade \"{upgrade.Prefab.Name}\" is not a integer, float, double or boolean but {OriginalValue?.GetType()} with a value of ({OriginalValue}). \n" +
"The value has been assumed to be '0', did you forget a Convert.ChangeType()?");
break;
}
}
else
{
DebugConsole.AddWarning($"Original value of \"{Name}\" in the upgrade \"{upgrade.Prefab.Name}\" is not a integer, float or a double but {OriginalValue?.GetType()} with a value of ({OriginalValue}). \n" +
"The value has been assumed to be '0', did you forget a Convert.ChangeType()?");
}
return 0;
}
public static float CalculateUpgrade(object originalValue, int level, string Multiplier)
public static float CalculateUpgrade(float value, int level, string multiplier)
{
if (originalValue is float || originalValue is int || originalValue is double)
if (multiplier[^1] != '%')
{
var value = (float)originalValue;
if (Multiplier[^1] != '%')
{
float multiplier = 1.0f;
if (Multiplier.Length > 1)
{
if (prefixCharacters.Contains(Multiplier[0]))
{
float.TryParse(Multiplier.Substring(1).Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out multiplier);
}
}
switch (Multiplier[0])
{
case '*':
case 'x':
return value * (multiplier * level);
case '/':
return value / (multiplier * level);
case '-':
return value - (multiplier * level);
case '+':
return value + (multiplier * level);
case '=':
return multiplier;
}
}
else
{
float multiplier = UpgradePrefab.ParsePercentage(Multiplier, Identifier.Empty, suppressWarnings: true);
return ApplyPercentage(value, multiplier, level);
}
return CalculateUpgradeFloat(multiplier, value , level);
}
return float.NaN;
return ApplyPercentage(value, UpgradePrefab.ParsePercentage(multiplier, Identifier.Empty, suppressWarnings: true), level);
}
private static float CalculateUpgradeFloat(string multiplier, float value, int level)
{
float multiplierFloat = ParseValue(multiplier, value);
switch (multiplier[0])
{
case '*':
case 'x':
return value * (multiplierFloat * level);
case '/':
return value / (multiplierFloat * level);
case '-':
return value - (multiplierFloat * level);
case '+':
return value + (multiplierFloat * level);
case '=':
return multiplierFloat;
}
return 0;
}
/// <summary>
@@ -133,7 +108,20 @@ namespace Barotrauma
{
if (savedValue.NameAsIdentifier() == Name)
{
OriginalValue = savedValue.GetAttributeFloat("value", 0.0f);
string value = savedValue.GetAttributeString("value", string.Empty);
if (float.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out float floatValue))
{
OriginalValue = floatValue;
}
else if (bool.TryParse(value, out bool boolValue))
{
OriginalValue = boolValue;
}
else
{
OriginalValue = value;
}
}
}
}
@@ -155,30 +143,23 @@ namespace Barotrauma
return attributes.Select(attribute => new PropertyReference(attribute.NameAsIdentifier(), attribute.Value, upgrade)).ToArray();
}
private float ParseValue()
private static float ParseValue(string multiplier, object? originalValue)
{
if (Multiplier.Length > 1)
if (multiplier.Length > 1)
{
if (prefixCharacters.Contains(Multiplier[0]))
if (prefixCharacters.Contains(multiplier[0]))
{
if (float.TryParse(Multiplier.Substring(1).Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out float value)) { return value; }
if (float.TryParse(multiplier.Substring(1).Trim(), NumberStyles.Number, CultureInfo.InvariantCulture, out float value)) { return value; }
if (OriginalValue is float || OriginalValue is int || OriginalValue is double) { return (float) OriginalValue; }
if (originalValue is float || originalValue is int || originalValue is double) { return (float) originalValue; }
}
}
if (!upgrade.Prefab.SuppressWarnings)
{
DebugConsole.AddWarning($"Multiplier for {Name} is too short or does not contain proper prefix. \n" +
$"The value should start with {string.Join(",", prefixCharacters)} and contain a floating point value or another property. \n" +
"The value has been assumed to be '1'.");
}
return 1;
}
}
internal class Upgrade : IDisposable
internal sealed class Upgrade : IDisposable
{
private ISerializableEntity TargetEntity { get; }
@@ -379,10 +360,10 @@ namespace Barotrauma
{
if (entity.SerializableProperties.TryGetValue(propertyReference.Name, out SerializableProperty? property) && property != null)
{
object? originalValue = property!.GetValue(entity);
object? originalValue = property.GetValue(entity);
propertyReference.SetOriginalValue(originalValue);
object newValue = Convert.ChangeType(propertyReference.CalculateUpgrade(Level, sourceElement), originalValue.GetType(), NumberFormatInfo.InvariantInfo);
property!.SetValue(entity, newValue);
object newValue = Convert.ChangeType(propertyReference.CalculateUpgrade(Level), originalValue.GetType(), NumberFormatInfo.InvariantInfo);
property.SetValue(entity, newValue);
}
else
{