better number formatting

This commit is contained in:
Ellpeck 2020-06-25 14:18:57 +02:00
parent 731cc1e727
commit bb0fd54713
7 changed files with 48 additions and 19 deletions

View file

@ -86,3 +86,9 @@
/processorParam:TextureFormat=Color /processorParam:TextureFormat=Color
/build:Textures/Ui.png /build:Textures/Ui.png
#begin Localization/NumberFormat.de.json5
/copy:Localization/NumberFormat.de.json5
#begin Localization/NumberFormat.json5
/copy:Localization/NumberFormat.json5

View file

@ -12,6 +12,7 @@
"Options": "Optionen", "Options": "Optionen",
"RainingTicketLimit": "Max. Fallende Tickets", "RainingTicketLimit": "Max. Fallende Tickets",
"SoundVolume": "Lautstärke", "SoundVolume": "Lautstärke",
"AGameByEllpeck": "Ein Spiel von Ellpeck",
"----- Tutorial -----": "", "----- Tutorial -----": "",
"Tutorial1": "Hi! Willkommen zu Touchy Tickets. Um das Spiel zu starten, tippe einfach den Ticket-Laden an, um ein <i ticket> zu verkaufen. Verkaufe erstmal 50<i ticket>!", "Tutorial1": "Hi! Willkommen zu Touchy Tickets. Um das Spiel zu starten, tippe einfach den Ticket-Laden an, um ein <i ticket> zu verkaufen. Verkaufe erstmal 50<i ticket>!",
"Tutorial2": "Super! Jetzt kannst du deine erste Attraktion kaufen. Wechsel durch Wischen zum rechten Menü und kaufe ein Karussell.", "Tutorial2": "Super! Jetzt kannst du deine erste Attraktion kaufen. Wechsel durch Wischen zum rechten Menü und kaufe ein Karussell.",

View file

@ -12,6 +12,7 @@
"Options": "Options", "Options": "Options",
"RainingTicketLimit": "Max Raining Tickets", "RainingTicketLimit": "Max Raining Tickets",
"SoundVolume": "Sound Volume", "SoundVolume": "Sound Volume",
"AGameByEllpeck":"A game by Ellpeck",
"----- Tutorial -----": "", "----- Tutorial -----": "",
"Tutorial1": "Hi! Welcome to Touchy Tickets. To start the game, simply tap the ticket booth to sell a <i ticket>. Start by racking up 50<i ticket>!", "Tutorial1": "Hi! Welcome to Touchy Tickets. To start the game, simply tap the ticket booth to sell a <i ticket>. Start by racking up 50<i ticket>!",
"Tutorial2": "Great! Now, you can buy your first attraction. Access the menu on the right by swiping and purchase a carousel.", "Tutorial2": "Great! Now, you can buy your first attraction. Access the menu on the right by swiping and purchase a carousel.",

View file

@ -0,0 +1,14 @@
[
"0", // Hundert
"0,.##t", // Tausend
"0,,.##M", // Millionen
"0,,,.##Mr", // Milliarden
"0,,,,.##B", // Billionen
"0,,,,,.##Br", // Billiarden
"0,,,,,,.##T", // Trillionen
"0,,,,,,,.##Tr", // Trilliarden
"0,,,,,,,,.##Q", // Quadrillionen
"0,,,,,,,,,.##Qr", // Quadrilliarden
"0,,,,,,,,,,.##Qi", // Quintillionen
"0,,,,,,,,,,,.##Qir", // Quintilliarden
]

View file

@ -0,0 +1,14 @@
[
"0", // hundreds
"0,.##K", // thousands
"0,,.##M", // millions
"0,,,.##B", // billions
"0,,,,.##T", // trillions
"0,,,,,.##Q", // quadrillions
"0,,,,,,.##Qi", // quintillions
"0,,,,,,,.##S", // sextillions
"0,,,,,,,,.##Sp", // septillions
"0,,,,,,,,,.##O", // octillions
"0,,,,,,,,,,.##N", // nonillions
"0,,,,,,,,,,,.##D", // decillions
]

View file

@ -10,6 +10,7 @@ using Newtonsoft.Json;
namespace TouchyTickets { namespace TouchyTickets {
public static class Localization { public static class Localization {
public static readonly List<string> NumberFormat = LoadLocalized<List<string>>("NumberFormat", "json5");
private static readonly Dictionary<string, string> Strings = LoadLocalized<Dictionary<string, string>>("Localization"); private static readonly Dictionary<string, string> Strings = LoadLocalized<Dictionary<string, string>>("Localization");
private static readonly List<string> News = LoadLocalized<List<string>>("News"); private static readonly List<string> News = LoadLocalized<List<string>>("News");
private static readonly Random Random = new Random(); private static readonly Random Random = new Random();
@ -22,10 +23,10 @@ namespace TouchyTickets {
return News[Random.Next(News.Count)]; return News[Random.Next(News.Count)];
} }
private static T LoadLocalized<T>(string name) { private static T LoadLocalized<T>(string name, string extension = "json") {
var location = GameImpl.Instance.Content.RootDirectory + "/Localization/" + name; var location = GameImpl.Instance.Content.RootDirectory + "/Localization/" + name;
var culture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName; var culture = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
foreach (var path in new[] {$"{location}.{culture}.json", $"{location}.json"}) { foreach (var path in new[] {$"{location}.{culture}.{extension}", $"{location}.{extension}"}) {
try { try {
using (var reader = new JsonTextReader(new StreamReader(TitleContainer.OpenStream(path)))) using (var reader = new JsonTextReader(new StreamReader(TitleContainer.OpenStream(path))))
return SaveHandler.Serializer.Deserialize<T>(reader); return SaveHandler.Serializer.Deserialize<T>(reader);

View file

@ -460,7 +460,7 @@ namespace TouchyTickets {
}; };
var center = splash.AddChild(new Group(Anchor.Center, new Vector2(0.5F, 0.5F), false) {DrawAlpha = 0}); var center = splash.AddChild(new Group(Anchor.Center, new Vector2(0.5F, 0.5F), false) {DrawAlpha = 0});
center.AddChild(new Image(Anchor.AutoCenter, new Vector2(1, -1), Texture[4, 0])); center.AddChild(new Image(Anchor.AutoCenter, new Vector2(1, -1), Texture[4, 0]));
center.AddChild(new Paragraph(Anchor.AutoCenter, 10000, "A game by Ellpeck", true)); center.AddChild(new Paragraph(Anchor.AutoCenter, 10000, Localization.Get("AGameByEllpeck"), true));
GameImpl.Instance.UiSystem.Add("Splash", splash).Priority = 100000; GameImpl.Instance.UiSystem.Add("Splash", splash).Priority = 100000;
while (center.DrawAlpha < 1) { while (center.DrawAlpha < 1) {
center.DrawAlpha += 0.015F; center.DrawAlpha += 0.015F;
@ -584,7 +584,8 @@ namespace TouchyTickets {
}); });
var right = button.AddChild(new Group(Anchor.TopRight, new Vector2(0.8F, 1)) {CanBeMoused = false}); var right = button.AddChild(new Group(Anchor.TopRight, new Vector2(0.8F, 1)) {CanBeMoused = false});
right.AddChild(new Paragraph(Anchor.TopLeft, 1, Localization.Get(upgrade.Name), true)); right.AddChild(new Paragraph(Anchor.TopLeft, 1, Localization.Get(upgrade.Name), true));
right.AddChild(new Paragraph(Anchor.TopRight, 1, p => upgrade.Price + "<i star>", true)); if (!reachedActive)
right.AddChild(new Paragraph(Anchor.TopRight, 1, p => upgrade.Price + "<i star>", true));
right.AddChild(new Paragraph(Anchor.AutoLeft, 1, Localization.Get(upgrade.Name + "Description"), true) {TextScale = 0.08F}); right.AddChild(new Paragraph(Anchor.AutoLeft, 1, Localization.Get(upgrade.Name + "Description"), true) {TextScale = 0.08F});
} }
} }
@ -600,21 +601,12 @@ namespace TouchyTickets {
} }
private static string PrettyPrintNumber(BigInteger number) { private static string PrettyPrintNumber(BigInteger number) {
if (number < 1000) for (var i = 0; i < Localization.NumberFormat.Count; i++) {
return number.ToString(); if (number < BigInteger.Pow(1000, i + 1))
// thousands return number.ToString(Localization.NumberFormat[i]);
if (number < 1000000) }
return number.ToString("0,.##K"); // if the number is too large, just return the highest possible
// millions return number.ToString(Localization.NumberFormat.Last());
if (number < 1000000000)
return number.ToString("0,,.##M");
// billions
if (number < 1000000000000)
return number.ToString("0,,,.##B");
// trillions
if (number < 1000000000000000)
return number.ToString("0,,,,.##T");
return number.ToString("0,,,,,.##Q");
} }
} }