using System.Text.Json;
using System.Text.Json.Serialization;
namespace Akwaier.Engine;
/// Eén regel uit de scorelijst.
public sealed class Scoreregel
{
[JsonPropertyName("naam")] public string Naam { get; set; } = "";
[JsonPropertyName("vermogen")] public int Vermogen { get; set; }
}
/// De inhoud van het scorebestand: de gekozen taal en de ranglijst.
public sealed class Scorebestand
{
/// "nl" of "en"; leeg als er nog nooit een taal gekozen is.
[JsonPropertyName("taal")] public string TaalCode { get; set; } = "";
[JsonPropertyName("scores")] public List Scores { get; set; } = new();
}
///
/// Vervangt het bestand "SCORE" uit het origineel (regels 4050-4195) door een
/// leesbaar JSON-bestand naast het programma. Behalve de ranglijst staat ook de
/// taalkeuze erin, zodat het spel de volgende keer in dezelfde taal begint.
///
public static class Scorelijst
{
private const int Bewaar = 30;
private static readonly JsonSerializerOptions Opties = new() { WriteIndented = true };
public static string Pad => Path.Combine(
Path.GetDirectoryName(Environment.ProcessPath) ?? ".", "akwaier-scores.json");
///
/// Leest het bestand. Een bestand van vóór de taalkeuze bevat alleen een
/// lijst; dat wordt nog gewoon gelezen.
///
public static Scorebestand Lees()
{
try
{
if (!File.Exists(Pad)) return new Scorebestand();
string tekst = File.ReadAllText(Pad);
using var doc = JsonDocument.Parse(tekst);
if (doc.RootElement.ValueKind == JsonValueKind.Array)
return new Scorebestand
{
Scores = JsonSerializer.Deserialize>(tekst) ?? new(),
};
return JsonSerializer.Deserialize(tekst) ?? new Scorebestand();
}
catch (Exception)
{
// Een stukgelopen of met de hand aangepast bestand mag het spel niet
// tegenhouden; de lijst begint dan gewoon opnieuw.
return new Scorebestand();
}
}
private static void Schrijf(Scorebestand bestand)
{
try { File.WriteAllText(Pad, JsonSerializer.Serialize(bestand, Opties)); }
catch (Exception) { /* alleen-lezen map: dan geen lijst, maar wel doorspelen */ }
}
public static List Bijwerken(IEnumerable<(string Naam, int Vermogen)> nieuw)
{
var bestand = Lees();
bestand.Scores.AddRange(nieuw.Select(n => new Scoreregel
{
Naam = n.Naam,
Vermogen = n.Vermogen,
}));
bestand.Scores = bestand.Scores.OrderByDescending(r => r.Vermogen).Take(Bewaar).ToList();
bestand.TaalCode = Taal.Code;
Schrijf(bestand);
return bestand.Scores;
}
///
/// Zet de taal op de bewaarde keuze. Staat er nog niets in het bestand, dan
/// beslist de taalinstelling van Windows.
///
public static void LaadTaal()
{
string code = File.Exists(Pad) ? Lees().TaalCode : "";
if (string.IsNullOrWhiteSpace(code)) Taal.Engels = Taal.PcIsEngels();
else Taal.ZetCode(code);
}
public static void BewaarTaal()
{
var bestand = Lees();
if (bestand.TaalCode == Taal.Code && File.Exists(Pad)) return;
bestand.TaalCode = Taal.Code;
Schrijf(bestand);
}
}