This repository has been archived on 2025-10-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

75 lines
1.9 KiB
C#

using Microsoft.VisualBasic.CompilerServices;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RhythmBase.Components;
namespace RhythmBase.Converters
{
internal class RoomConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
Type type = value!.GetType();
if (type == typeof(RDRoom))
{
writer.WriteStartArray();
foreach (int item in (((RDRoom?)value) ?? default).Rooms)
writer.WriteValue(item);
writer.WriteEndArray();
}
else if (type == typeof(RDSingleRoom))
{
writer.WriteStartArray();
writer.WriteValue((((RDSingleRoom?)value) ?? default).Value);
writer.WriteEndArray();
}
else
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
JToken token = JArray.Load(reader);
byte[]? J = token.ToObject<byte[]>();
if (J == null)
throw new Exceptions.ConvertingException(token, new Exception($"Unreadable room: \"{J}\". path \"{reader.Path}\""));
bool flag = objectType == typeof(RDRoom);
object ReadJson;
if (flag)
{
bool enableTop;
if (existingValue != null)
{
object obj = existingValue;
enableTop = ((obj != null) ? ((RDRoom)obj) : default).EnableTop;
}
else
{
enableTop = true;
}
existingValue = new RDRoom(enableTop);
foreach (byte item in J)
{
NewLateBinding.LateIndexSet(existingValue,
[
item,
true
], null);
}
ReadJson = existingValue;
}
else
{
flag = objectType == typeof(RDSingleRoom);
if (!flag)
{
throw new NotImplementedException();
}
ReadJson = new RDSingleRoom(J.Single());
}
return ReadJson;
}
public override bool CanConvert(Type objectType) => objectType == typeof(RDRoom) || objectType == typeof(RDSingleRoom);
}
}