Skip to content

Commit f7f32be

Browse files
committed
feat: isolate TextStorage into custom type
1 parent b019045 commit f7f32be

7 files changed

Lines changed: 36 additions & 14 deletions

File tree

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
using FEZRepacker.Core.FileSystem;
2-
using FEZRepacker.Core.Helpers;
1+
using FEZRepacker.Core.Definitions.Game.Helpers;
2+
using FEZRepacker.Core.FileSystem;
33
using FEZRepacker.Core.Helpers.Json;
44

55
namespace FEZRepacker.Core.Conversion.Formats
66
{
7-
using TextStorage = OrderedDictionary<string, OrderedDictionary<string, string>>;
7+
using TextStorageContainer = IDictionary<string, IDictionary<string, string>>;
8+
89
internal class TextStorageConverter : FormatConverter<TextStorage>
910
{
1011
private const string BundleFileFormat = ".feztxt";
@@ -13,12 +14,13 @@ internal class TextStorageConverter : FormatConverter<TextStorage>
1314

1415
public override FileBundle ConvertTyped(TextStorage data)
1516
{
16-
return ConfiguredJsonSerializer.SerializeToFileBundle(BundleFileFormat, data);
17+
return ConfiguredJsonSerializer.SerializeToFileBundle(BundleFileFormat, data.AllResources);
1718
}
1819

1920
public override TextStorage DeconvertTyped(FileBundle bundle)
2021
{
21-
return ConfiguredJsonSerializer.DeserializeFromFileBundle<TextStorage>(bundle);
22+
var allResources = ConfiguredJsonSerializer.DeserializeFromFileBundle<TextStorageContainer>(bundle);
23+
return new TextStorage {AllResources = allResources};
2224
}
2325
}
2426
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace FEZRepacker.Core.Definitions.Game.Helpers
2+
{
3+
[XnbReaderType(
4+
"Microsoft.Xna.Framework.Content.DictionaryReader`2[[" +
5+
"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]," +
6+
"[System.Collections.Generic.Dictionary`2[[" +
7+
"System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]," +
8+
"[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" +
9+
"]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" +
10+
"]]")]
11+
// Wrapper class for text storage asset type. Helps with its management.
12+
// Original game reads dictionary type directly.
13+
public class TextStorage
14+
{
15+
[XnbProperty(SkipIdentifier = true, UseConverter = true)]
16+
public IDictionary<string, IDictionary<string, string>> AllResources { get; set; }
17+
}
18+
}

Core/Helpers/Json/JsonContexts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ internal partial class SkyJsonSerializerContext : JsonSerializerContext {}
5050
[JsonSerializable(typeof(SpriteFontPropertiesJsonModel))]
5151
internal partial class SpriteFontJsonSerializerContext : JsonSerializerContext {}
5252

53-
[JsonSerializable(typeof(OrderedDictionary<string, OrderedDictionary<string, string>>))]
53+
[JsonSerializable(typeof(IDictionary<string, IDictionary<string, string>>))]
5454
internal partial class TextStorageJsonSerializerContext : JsonSerializerContext {}
5555

5656
[JsonSerializable(typeof(TrackedSong))]

Core/XNB/ContentSerialization/System/DictionaryContentSerializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace FEZRepacker.Core.XNB.ContentSerialization.System
44
{
5-
internal class DictionaryContentSerializer<K, V> : XnbContentSerializer<OrderedDictionary<K, V>> where K : notnull
5+
internal class DictionaryContentSerializer<K, V> : XnbContentSerializer<IDictionary<K, V>> where K : notnull
66
{
77
private XnbAssemblyQualifier _name;
88
private bool skipKeyIdentifier;

Core/XNB/ContentTypes/TextStorageContentIdentity.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using FEZRepacker.Core.Helpers;
2-
using FEZRepacker.Core.XNB.ContentSerialization;
1+
using FEZRepacker.Core.XNB.ContentSerialization;
32
using FEZRepacker.Core.XNB.ContentSerialization.System;
43

54
namespace FEZRepacker.Core.XNB.ContentTypes
@@ -8,7 +7,8 @@ internal class TextStorageContentIdentity : XnbPrimaryContentIdentity
87
{
98
protected override List<XnbContentSerializer> ContentSerializersFactory => new()
109
{
11-
new DictionaryContentSerializer<string, OrderedDictionary<string, string>>(),
10+
new TextStorageContentSerializer().MarkPrivate(),
11+
new DictionaryContentSerializer<string, IDictionary<string, string>>(),
1212
new StringContentSerializer(),
1313
new DictionaryContentSerializer<string, string>()
1414
};

Core/XNB/XnbAssemblyQualifier.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@ public static XnbAssemblyQualifier GetForType(Type type)
166166
{
167167
fallback.Specification = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
168168
}
169+
170+
// match specific dictionary type usage
171+
if (fallback.Name.Contains("IDictionary"))
172+
{
173+
fallback.Name = fallback.Name.Replace("IDictionary", "Dictionary");
174+
}
169175

170176
fallback.AppendGenericTypesFromType(type);
171177
_xnbTypeCache[type] = fallback;

Core/XNB/XnbPrimaryContentIdentity.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ internal abstract class XnbPrimaryContentIdentity
2929
public XnbPrimaryContentIdentity()
3030
{
3131
ContentSerializers = ContentSerializersFactory;
32-
if (PrimaryContentSerializer.IsPrivate)
33-
{
34-
throw new XnbSerializationException($"{this.GetType().Name} has a private primary content type!");
35-
}
3632
}
3733

3834
public XnbContentSerializer? FindByReaderQualifier(XnbAssemblyQualifier qualifier)

0 commit comments

Comments
 (0)