Resolve issues of decimal formatting in non-English locales.

This commit is contained in:
Will
2016-02-11 21:22:13 -07:00
parent 4a35493246
commit bdde60d78c
4 changed files with 55 additions and 43 deletions

View File

@@ -7,6 +7,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Globalization;
#if UNITY
using UnityEngine;
#endif
@@ -21,6 +22,8 @@ namespace LibBSP {
/// </summary>
[Serializable] public class Entity : Dictionary<string, string>, IComparable, IComparable<Entity>, ISerializable {
private static IFormatProvider _format = CultureInfo.CreateSpecificCulture("en-US");
public const char ConnectionMemberSeparater = (char)0x1B;
public List<EntityConnection> connections = new List<EntityConnection>();
@@ -334,7 +337,7 @@ namespace LibBSP {
target = connection[0],
action = connection[1],
param = connection[2],
delay = Double.Parse(connection[3]),
delay = Double.Parse(connection[3], _format),
fireOnce = Int32.Parse(connection[4]),
unknown0 = connection.Length > 5 ? connection[5] : "",
unknown1 = connection.Length > 6 ? connection[6] : "",
@@ -361,7 +364,7 @@ namespace LibBSP {
if (connections.Count > 0) {
output.Append("connections\n{\n");
foreach (EntityConnection c in connections) {
output.Append(string.Format("\"{0}\" \"{1},{2},{3},{4},{5},{6},{7}\"\n", c.name, c.target, c.action, c.param, c.delay, c.fireOnce, c.unknown0, c.unknown1));
output.Append(string.Format("\"{0}\" \"{1},{2},{3},{4},{5},{6},{7}\"\n", c.name, c.target, c.action, c.param, c.delay.ToString(_format), c.fireOnce, c.unknown0, c.unknown1));
}
output.Append("}\n");
}
@@ -421,7 +424,7 @@ namespace LibBSP {
/// <returns>The numeric value of the value corresponding to <paramref name="key"/>.</returns>
public float GetFloat(string key, float? failDefault = null) {
try {
return Single.Parse(this[key]);
return Single.Parse(this[key], _format);
} catch (Exception e) {
if (!failDefault.HasValue) {
throw e;
@@ -439,7 +442,7 @@ namespace LibBSP {
/// <returns>The numeric value of the value corresponding to <paramref name="key"/>.</returns>
public int GetInt(string key, int? failDefault = null) {
try {
return Int32.Parse(this[key]);
return Int32.Parse(this[key], _format);
} catch (Exception e) {
if (!failDefault.HasValue) {
throw e;
@@ -459,7 +462,7 @@ namespace LibBSP {
string[] nums = this[key].Split(' ');
for (int i = 0; i < results.Length && i < nums.Length; ++i) {
try {
results[i] = System.Single.Parse(nums[i]);
results[i] = Single.Parse(nums[i], _format);
} catch {
results[i] = 0;
}

View File

@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System;
using System.Globalization;
#if UNITY
using UnityEngine;
#endif
@@ -17,6 +18,8 @@ namespace LibBSP {
/// </summary>
[Serializable] public class MAPBrushSide {
private static IFormatProvider _format = CultureInfo.CreateSpecificCulture("en-US");
public Vector3[] vertices;
public Plane plane;
public string texture;
@@ -51,35 +54,35 @@ namespace LibBSP {
// If this succeeds, assume brushDef3
if (Single.TryParse(tokens[4], out dist)) {
plane = new Plane(new Vector3(Single.Parse(tokens[1]), Single.Parse(tokens[2]), Single.Parse(tokens[3])), dist);
textureS = new Vector3(Single.Parse(tokens[8]), Single.Parse(tokens[9]), Single.Parse(tokens[10]));
textureT = new Vector3(Single.Parse(tokens[13]), Single.Parse(tokens[14]), Single.Parse(tokens[15]));
plane = new Plane(new Vector3(Single.Parse(tokens[1], _format), Single.Parse(tokens[2], _format), Single.Parse(tokens[3], _format)), dist);
textureS = new Vector3(Single.Parse(tokens[8], _format), Single.Parse(tokens[9], _format), Single.Parse(tokens[10], _format));
textureT = new Vector3(Single.Parse(tokens[13], _format), Single.Parse(tokens[14], _format), Single.Parse(tokens[15], _format));
texture = tokens[18];
} else {
Vector3 v1 = new Vector3(Single.Parse(tokens[1]), Single.Parse(tokens[2]), Single.Parse(tokens[3]));
Vector3 v2 = new Vector3(Single.Parse(tokens[6]), Single.Parse(tokens[7]), Single.Parse(tokens[8]));
Vector3 v3 = new Vector3(Single.Parse(tokens[11]), Single.Parse(tokens[12]), Single.Parse(tokens[13]));
Vector3 v1 = new Vector3(Single.Parse(tokens[1], _format), Single.Parse(tokens[2], _format), Single.Parse(tokens[3], _format));
Vector3 v2 = new Vector3(Single.Parse(tokens[6], _format), Single.Parse(tokens[7], _format), Single.Parse(tokens[8], _format));
Vector3 v3 = new Vector3(Single.Parse(tokens[11], _format), Single.Parse(tokens[12], _format), Single.Parse(tokens[13], _format));
vertices = new Vector3[] { v1, v2, v3 };
plane = new Plane(v1, v2, v3);
texture = tokens[15];
// GearCraft
if (tokens[16] == "[") {
textureS = new Vector3(Single.Parse(tokens[17]), Single.Parse(tokens[18]), Single.Parse(tokens[19]));
textureShiftS = Double.Parse(tokens[20]);
textureT = new Vector3(Single.Parse(tokens[23]), Single.Parse(tokens[24]), Single.Parse(tokens[25]));
textureShiftT = Double.Parse(tokens[26]);
texRot = Single.Parse(tokens[28]);
texScaleX = Double.Parse(tokens[29]);
texScaleY = Double.Parse(tokens[30]);
textureS = new Vector3(Single.Parse(tokens[17], _format), Single.Parse(tokens[18], _format), Single.Parse(tokens[19], _format));
textureShiftS = Double.Parse(tokens[20], _format);
textureT = new Vector3(Single.Parse(tokens[23], _format), Single.Parse(tokens[24], _format), Single.Parse(tokens[25], _format));
textureShiftT = Double.Parse(tokens[26], _format);
texRot = Single.Parse(tokens[28], _format);
texScaleX = Double.Parse(tokens[29], _format);
texScaleY = Double.Parse(tokens[30], _format);
flags = Int32.Parse(tokens[31]);
material = tokens[32];
} else {
//<x_shift> <y_shift> <rotation> <x_scale> <y_scale> <content_flags> <surface_flags> <value>
textureShiftS = Single.Parse(tokens[16]);
textureShiftT = Single.Parse(tokens[17]);
texRot = Single.Parse(tokens[18]);
texScaleX = Double.Parse(tokens[19]);
texScaleY = Double.Parse(tokens[20]);
textureShiftS = Single.Parse(tokens[16], _format);
textureShiftT = Single.Parse(tokens[17], _format);
texRot = Single.Parse(tokens[18], _format);
texScaleX = Double.Parse(tokens[19], _format);
texScaleY = Double.Parse(tokens[20], _format);
flags = Int32.Parse(tokens[22]);
}
}
@@ -113,32 +116,32 @@ namespace LibBSP {
case "plane": {
string[] points = tokens[1].SplitUnlessBetweenDelimiters(' ', '(', ')', StringSplitOptions.RemoveEmptyEntries);
string[] components = points[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Vector3 v1 = new Vector3(Single.Parse(components[0]), Single.Parse(components[1]), Single.Parse(components[2]));
Vector3 v1 = new Vector3(Single.Parse(components[0], _format), Single.Parse(components[1], _format), Single.Parse(components[2], _format));
components = points[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Vector3 v2 = new Vector3(Single.Parse(components[0]), Single.Parse(components[1]), Single.Parse(components[2]));
Vector3 v2 = new Vector3(Single.Parse(components[0], _format), Single.Parse(components[1], _format), Single.Parse(components[2], _format));
components = points[2].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Vector3 v3 = new Vector3(Single.Parse(components[0]), Single.Parse(components[1]), Single.Parse(components[2]));
Vector3 v3 = new Vector3(Single.Parse(components[0], _format), Single.Parse(components[1], _format), Single.Parse(components[2], _format));
plane = new Plane(v1, v2, v3);
break;
}
case "uaxis": {
string[] split = tokens[1].SplitUnlessBetweenDelimiters(' ', '[', ']', StringSplitOptions.RemoveEmptyEntries);
texScaleX = Single.Parse(split[1]);
texScaleX = Single.Parse(split[1], _format);
split = split[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
textureS = new Vector3(Single.Parse(split[0]), Single.Parse(split[1]), Single.Parse(split[2]));
textureShiftS = Single.Parse(split[3]);
textureS = new Vector3(Single.Parse(split[0], _format), Single.Parse(split[1], _format), Single.Parse(split[2], _format));
textureShiftS = Single.Parse(split[3], _format);
break;
}
case "vaxis": {
string[] split = tokens[1].SplitUnlessBetweenDelimiters(' ', '[', ']', StringSplitOptions.RemoveEmptyEntries);
texScaleY = Single.Parse(split[1]);
texScaleY = Single.Parse(split[1], _format);
split = split[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
textureT = new Vector3(Single.Parse(split[0]), Single.Parse(split[1]), Single.Parse(split[2]));
textureShiftT = Single.Parse(split[3]);
textureT = new Vector3(Single.Parse(split[0], _format), Single.Parse(split[1], _format), Single.Parse(split[2], _format));
textureShiftT = Single.Parse(split[3], _format);
break;
}
case "rotation": {
texRot = Single.Parse(tokens[1]);
texRot = Single.Parse(tokens[1], _format);
break;
}
}

View File

@@ -5,6 +5,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
#if UNITY
using UnityEngine;
#endif
@@ -18,6 +19,8 @@ namespace LibBSP {
/// </summary>
[Serializable] public class MAPDisplacement {
private static IFormatProvider _format = CultureInfo.CreateSpecificCulture("en-US");
public int power;
public Vector3 start;
public Vector3[][] normals;
@@ -82,7 +85,7 @@ namespace LibBSP {
}
case "startposition": {
string[] point = tokens[1].Substring(1, tokens[1].Length - 2).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
start = new Vector3(Single.Parse(point[0]), Single.Parse(point[1]), Single.Parse(point[2]));
start = new Vector3(Single.Parse(point[0], _format), Single.Parse(point[1], _format), Single.Parse(point[2], _format));
break;
}
}
@@ -116,9 +119,9 @@ namespace LibBSP {
foreach (int i in normalsTokens.Keys) {
for (int j = 0; j < normalsTokens[i].Length / 3; j++) {
normals[i][j] = new Vector3(Single.Parse(normalsTokens[i][j * 3]), Single.Parse(normalsTokens[i][(j * 3) + 1]), Single.Parse(normalsTokens[i][(j * 3) + 2]));
distances[i][j] = Single.Parse(distancesTokens[i][j]);
alphas[i][j] = Single.Parse(alphasTokens[i][j]);
normals[i][j] = new Vector3(Single.Parse(normalsTokens[i][j * 3], _format), Single.Parse(normalsTokens[i][(j * 3) + 1], _format), Single.Parse(normalsTokens[i][(j * 3) + 2], _format));
distances[i][j] = Single.Parse(distancesTokens[i][j], _format);
alphas[i][j] = Single.Parse(alphasTokens[i][j], _format);
}
}

View File

@@ -3,6 +3,7 @@
#endif
using System;
using System.Collections.Generic;
using System.Globalization;
#if UNITY
using UnityEngine;
#else
@@ -20,6 +21,8 @@ namespace LibBSP {
/// </summary>
[Serializable] public class MAPPatch {
private static IFormatProvider _format = CultureInfo.CreateSpecificCulture("en-US");
public UIVertex[] points;
public Vector2 dims;
public string texture;
@@ -42,12 +45,12 @@ namespace LibBSP {
case "patchDef3":
case "patchDef2": {
string[] line = lines[3].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
dims = new Vector2(Single.Parse(line[1]), Single.Parse(line[2]));
dims = new Vector2(Single.Parse(line[1], _format), Single.Parse(line[2], _format));
for (int i = 0; i < dims.x; ++i) {
line = lines[i + 5].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int j = 0; j < dims.y; ++j) {
Vector3 point = new Vector3(Single.Parse(line[2 + (j * 7)]), Single.Parse(line[3 + (j * 7)]), Single.Parse(line[4 + (j * 7)]));
Vector2 uv = new Vector2(Single.Parse(line[5 + (j * 7)]), Single.Parse(line[6 + (j * 7)]));
Vector3 point = new Vector3(Single.Parse(line[2 + (j * 7)], _format), Single.Parse(line[3 + (j * 7)], _format), Single.Parse(line[4 + (j * 7)], _format));
Vector2 uv = new Vector2(Single.Parse(line[5 + (j * 7)], _format), Single.Parse(line[6 + (j * 7)], _format));
UIVertex vertex = new UIVertex() {
position = point,
uv0 = uv
@@ -59,12 +62,12 @@ namespace LibBSP {
}
case "patchTerrainDef3": {
string[] line = lines[3].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
dims = new Vector2(Single.Parse(line[1]), Single.Parse(line[2]));
dims = new Vector2(Single.Parse(line[1], _format), Single.Parse(line[2], _format));
for (int i = 0; i < dims.x; ++i) {
line = lines[i + 5].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int j = 0; j < dims.y; ++j) {
Vector3 point = new Vector3(Single.Parse(line[2 + (j * 12)]), Single.Parse(line[3 + (j * 12)]), Single.Parse(line[4 + (j * 12)]));
Vector2 uv = new Vector2(Single.Parse(line[5 + (j * 12)]), Single.Parse(line[6 + (j * 12)]));
Vector3 point = new Vector3(Single.Parse(line[2 + (j * 12)], _format), Single.Parse(line[3 + (j * 12)], _format), Single.Parse(line[4 + (j * 12)], _format));
Vector2 uv = new Vector2(Single.Parse(line[5 + (j * 12)], _format), Single.Parse(line[6 + (j * 12)], _format));
Color32 color = Color32Extensions.FromArgb(Byte.Parse(line[7 + (j * 12)]), Byte.Parse(line[8 + (j * 12)]), Byte.Parse(line[9 + (j * 12)]), Byte.Parse(line[10 + (j * 12)]));
UIVertex vertex = new UIVertex() {
position = point,