Skip to content

Commit 59dc991

Browse files
committed
It works!
1 parent 78453b5 commit 59dc991

File tree

13 files changed

+361
-134
lines changed

13 files changed

+361
-134
lines changed

FDSPacker/FDSPacker.csproj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
@@ -18,6 +18,7 @@
1818
<PackageTags>Nintendo;Famicom;FDS;Famicom Disk System</PackageTags>
1919
<Configurations>Debug;Release;Interim</Configurations>
2020
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
21+
<LangVersion>11.0</LangVersion>
2122
</PropertyGroup>
2223

2324
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
@@ -53,7 +54,8 @@
5354

5455
<ItemGroup>
5556
<PackageReference Include="CommandLineParser" Version="2.9.1" />
56-
<PackageReference Include="NesContainers" Version="1.1.5" />
57+
<PackageReference Include="NesContainers" Version="1.1.7" />
58+
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
5759
</ItemGroup>
5860

5961
<ItemGroup>

FDSPacker/FdsPackUnpack.cs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,25 @@
88
using System.Threading.Tasks;
99
using wtf.cluster.FDSPacker.JsonTypes;
1010
using System.Text.RegularExpressions;
11+
using Newtonsoft.Json;
12+
using Newtonsoft.Json.Serialization;
1113

1214
namespace wtf.cluster.FDSPacker
1315
{
1416
static class FdsPackUnpack
1517
{
1618
const string DISK_INFO_FILE = "diskinfo.json";
1719

20+
static JsonSerializerSettings jsonOptions = new JsonSerializerSettings
21+
{
22+
NullValueHandling = NullValueHandling.Include,
23+
ContractResolver = new DefaultContractResolver
24+
{
25+
NamingStrategy = new SnakeCaseNamingStrategy()
26+
},
27+
Formatting = Formatting.Indented
28+
};
29+
1830
// Unpack a .fds file
1931
public static void Unpack(UnpackOptions options)
2032
{
@@ -23,10 +35,12 @@ public static void Unpack(UnpackOptions options)
2335

2436
// Copy data to a JSON object
2537
var root = new FdsJsonRoot();
38+
var invalidCharsPattern = $"[{Regex.Escape(new string(Path.GetInvalidFileNameChars()))}]";
2639
for (var sideId = 0; sideId < fds.Sides.Count; sideId++)
2740
{
2841
var side = fds.Sides[sideId];
2942
var outSide = new FdsJsonSide();
43+
outSide.WriteUnknown = !options.NoUnknown;
3044
var sideDirName = $"side_{sideId + 1}";
3145
var sideFullPath = Path.Combine(options.OutputDir, sideDirName);
3246
Directory.CreateDirectory(sideFullPath);
@@ -39,8 +53,8 @@ public static void Unpack(UnpackOptions options)
3953
var outFile = new FdsJsonFile();
4054
CopyProperties(file, outFile);
4155
// Avoid filename duplication
42-
var name = file.FileName;
43-
var altName = name.ToLower();
56+
var name = Regex.Replace(file.FileName.ToLower(), invalidCharsPattern, "_");
57+
var altName = name;
4458
int id = 1;
4559
while (usedFiles.Contains(altName!))
4660
{
@@ -72,14 +86,7 @@ public static void Unpack(UnpackOptions options)
7286

7387
// Save JSON
7488
var targetFile = Path.Combine(options.OutputDir, DISK_INFO_FILE);
75-
var jsonOptions = new JsonSerializerOptions
76-
{
77-
WriteIndented = true,
78-
DefaultIgnoreCondition = JsonIgnoreCondition.Never,
79-
ReadCommentHandling = JsonCommentHandling.Skip,
80-
PropertyNamingPolicy = new SnakeCaseNamingPolicy()
81-
};
82-
var json = JsonSerializer.Serialize(root, jsonOptions);
89+
var json = JsonConvert.SerializeObject(root, jsonOptions);
8390
File.WriteAllText(targetFile, json);
8491
}
8592

@@ -89,14 +96,8 @@ public static void Pack(PackOptions options)
8996
var inputFile = options.InputFile;
9097
if (Directory.Exists(inputFile))
9198
inputFile = Path.Combine(inputFile, DISK_INFO_FILE); ;
92-
var jsonOptions = new JsonSerializerOptions
93-
{
94-
DefaultIgnoreCondition = JsonIgnoreCondition.Never,
95-
ReadCommentHandling = JsonCommentHandling.Skip,
96-
PropertyNamingPolicy = new SnakeCaseNamingPolicy()
97-
};
9899
var jsonData = File.ReadAllText(inputFile);
99-
var root = JsonSerializer.Deserialize<FdsJsonRoot>(jsonData, jsonOptions);
100+
var root = JsonConvert.DeserializeObject<FdsJsonRoot>(jsonData, jsonOptions);
100101
if (root == null) throw new InvalidDataException("Invalid input JSON file");
101102

102103
// Copy data from a JSON object

FDSPacker/JsonConverters/ByteHexConverter.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,25 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5-
using System.Text.Json.Serialization;
6-
using System.Text.Json;
75
using System.Threading.Tasks;
6+
using Newtonsoft.Json;
87

98
namespace wtf.cluster.FDSPacker.JsonConverters
109
{
11-
internal class ByteHexConverter : JsonConverter<byte>
10+
internal class ByteHexConverter : JsonConverter
1211
{
13-
public override byte Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
12+
public override bool CanConvert(Type objectType)
13+
=> objectType == typeof(byte);
14+
15+
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
1416
{
15-
var value = reader.GetString();
17+
var value = reader.Value?.ToString();
1618
return (byte)value!.ParseHex();
1719
}
1820

19-
public override void Write(Utf8JsonWriter writer, byte value, JsonSerializerOptions options)
21+
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
2022
{
21-
writer.WriteStringValue($"${value:X02}");
23+
writer.WriteValue($"${value:X02}");
2224
}
2325
}
2426
}
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
using System.Text.Json.Serialization;
2-
using System.Text.Json;
1+
using Newtonsoft.Json;
32

43
namespace wtf.cluster.FDSPacker.JsonConverters
54
{
6-
internal class ByteIntConverter : JsonConverter<byte>
5+
internal class ByteIntConverter : JsonConverter
76
{
8-
public override byte Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
7+
public override bool CanConvert(Type objectType)
8+
=> objectType == typeof(byte);
9+
10+
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
911
{
10-
var value = reader.GetString();
12+
var value = reader.Value?.ToString();
1113
return (byte)value!.ParseHex();
1214
}
1315

14-
public override void Write(Utf8JsonWriter writer, byte value, JsonSerializerOptions options)
16+
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
1517
{
16-
writer.WriteStringValue($"{value}");
18+
writer.WriteValue($"{value}");
1719
}
1820
}
1921
}
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1-
using System.Text.Json.Serialization;
2-
using System.Text.Json;
1+
using Newtonsoft.Json;
32

43
namespace wtf.cluster.FDSPacker.JsonConverters
54
{
6-
internal class CharHexConverter : JsonConverter<char>
5+
internal class CharHexConverter : JsonConverter
76
{
8-
public override char Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
7+
public override bool CanConvert(Type objectType)
8+
=> objectType == typeof(char);
9+
10+
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
911
{
10-
var value = reader.GetString();
12+
var value = reader.Value?.ToString();
1113
if (value!.Length == 1)
1214
return value[0];
1315
else
1416
return (char)value.ParseHex();
1517
}
1618

17-
public override void Write(Utf8JsonWriter writer, char value, JsonSerializerOptions options)
19+
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
1820
{
19-
if (!char.IsControl(value) && char.IsAscii(value))
20-
writer.WriteStringValue(new string(value, 1));
21-
writer.WriteStringValue($"${(byte)value:X02}");
21+
if (!char.IsControl((char)value!) && char.IsAscii((char)value))
22+
writer.WriteValue(new string((char)value, 1));
23+
else
24+
writer.WriteValue($"${Convert.ToByte(value):X02}");
2225
}
2326
}
2427
}

FDSPacker/JsonConverters/EnumHexConverter.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,30 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5-
using System.Text.Json.Serialization;
6-
using System.Text.Json;
75
using System.Threading.Tasks;
6+
using Newtonsoft.Json;
87

98
namespace wtf.cluster.FDSPacker.JsonConverters
109
{
11-
internal class EnumHexConverter<T> : JsonConverter<T> where T : Enum
10+
internal class EnumHexConverter<T> : JsonConverter
1211
{
13-
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
12+
public override bool CanConvert(Type objectType)
13+
=> objectType.IsEnum;
14+
15+
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
1416
{
15-
var value = reader.GetString();
16-
if (string.IsNullOrEmpty(value))
17-
return (T)Enum.ToObject(typeToConvert, 0);
17+
var value = reader.Value?.ToString();
1818
if (Enum.TryParse(typeof(T), value, true, out object? result))
1919
return (T)result!;
20-
return (T)Enum.ToObject(typeToConvert, value.ParseHex());
20+
return (T)Enum.ToObject(typeof(T), value!.ParseHex());
2121
}
2222

23-
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
23+
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
2424
{
25-
if (Enum.IsDefined(typeof(T), value))
26-
{
27-
writer.WriteStringValue(value.ToString());
28-
}
25+
if (Enum.IsDefined(typeof(T), value!))
26+
writer.WriteValue(value!.ToString());
2927
else
30-
{
31-
writer.WriteStringValue($"${Convert.ToUInt32(value):X02}");
32-
}
28+
writer.WriteValue($"${Convert.ToUInt32(value):X02}");
3329
}
3430
}
3531
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
using System.Text.Json.Serialization;
2-
using System.Text.Json;
1+
using Newtonsoft.Json;
32

43
namespace wtf.cluster.FDSPacker.JsonConverters
54
{
6-
internal class UShortHexConverter : JsonConverter<ushort>
5+
internal class UShortHexConverter : JsonConverter
76
{
8-
public override ushort Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
7+
public override bool CanConvert(Type objectType)
8+
=> objectType == typeof(ushort);
9+
10+
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
911
{
10-
var value = reader.GetString();
11-
return (ushort)value!.ParseHex();
12+
var value = reader.Value?.ToString();
13+
return value!.ParseHex();
1214
}
1315

14-
public override void Write(Utf8JsonWriter writer, ushort value, JsonSerializerOptions options)
16+
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
1517
{
16-
writer.WriteStringValue($"${value:X04}");
18+
writer.WriteValue($"${value:X04}");
1719
}
1820
}
1921
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
using System.Text.Json.Serialization;
2-
using System.Text.Json;
1+
using Newtonsoft.Json;
32

43
namespace wtf.cluster.FDSPacker.JsonConverters
54
{
6-
internal class UShortIntConverter : JsonConverter<ushort>
5+
internal class UShortIntConverter : JsonConverter
76
{
8-
public override ushort Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
7+
public override bool CanConvert(Type objectType)
8+
=> objectType == typeof(ushort);
9+
10+
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
911
{
10-
var value = reader.GetString();
11-
return (ushort)value!.ParseHex();
12+
var value = reader.Value?.ToString();
13+
return value!.ParseHex();
1214
}
1315

14-
public override void Write(Utf8JsonWriter writer, ushort value, JsonSerializerOptions options)
16+
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
1517
{
16-
writer.WriteStringValue($"{value}");
18+
writer.WriteValue($"${value}");
1719
}
1820
}
1921
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
using System;
1+
using Newtonsoft.Json;
2+
using System;
23
using System.Collections.Generic;
34
using System.Globalization;
45
using System.Linq;
5-
using System.Text;
6-
using System.Text.Json.Serialization;
76
using System.Threading.Tasks;
87
using wtf.cluster.FDSPacker;
98
using wtf.cluster.FDSPacker.JsonConverters;
@@ -13,15 +12,26 @@ namespace wtf.cluster.FDSPacker.JsonTypes
1312
{
1413
internal class FdsJsonFile
1514
{
15+
[JsonProperty(Order = 0)]
1616
[JsonConverter(typeof(ByteIntConverter))]
1717
public byte FileNumber { get; set; }
18+
19+
[JsonProperty(Order = 1)]
1820
[JsonConverter(typeof(ByteIntConverter))]
1921
public byte FileIndicateCode { get; set; }
22+
23+
[JsonProperty(Order = 2)]
2024
public string? FileName { get; set; }
25+
26+
[JsonProperty(Order = 3)]
2127
[JsonConverter(typeof(UShortHexConverter))]
2228
public ushort FileAddress { get; set; }
29+
30+
[JsonProperty(Order = 4)]
2331
[JsonConverter(typeof(EnumHexConverter<Kind>))]
2432
public Kind FileKind { get; set; }
33+
34+
[JsonProperty(Order = 5)]
2535
public string Data { get; set; } = string.Empty;
2636
}
2737
}

0 commit comments

Comments
 (0)