Archived
forked from RDTKEditor/RDTKEditor
添加对 Core 的直接引用
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using Microsoft.VisualBasic.CompilerServices;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using RhythmBase.Adofai.Components;
|
||||
using RhythmBase.Adofai.Events;
|
||||
using RhythmBase.Adofai.Utils;
|
||||
using RhythmBase.Settings;
|
||||
namespace RhythmBase.Adofai.Converters
|
||||
{
|
||||
internal class ADBaseEventConverter<TEvent>(ADLevel level, LevelReadOrWriteSettings inputSettings) : JsonConverter<TEvent> where TEvent : ADBaseEvent
|
||||
{
|
||||
public override bool CanRead
|
||||
{
|
||||
get
|
||||
{
|
||||
return _canread;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanWrite
|
||||
{
|
||||
get
|
||||
{
|
||||
return _canwrite;
|
||||
}
|
||||
}
|
||||
public override void WriteJson(JsonWriter writer, TEvent? value, JsonSerializer serializer) => throw new NotImplementedException();
|
||||
|
||||
public override TEvent ReadJson(JsonReader reader, Type objectType, TEvent? existingValue, bool hasExistingValue, JsonSerializer serializer) => GetDeserializedObject((JObject)JToken.ReadFrom(reader), objectType, existingValue, hasExistingValue, serializer);
|
||||
|
||||
public virtual TEvent GetDeserializedObject(JObject jobj, Type objectType, TEvent existingValue, bool hasExistingValue, JsonSerializer serializer)
|
||||
{
|
||||
Type SubClassType = Utils.Utils.ADConvertToType(jobj["eventType"].ToObject<string>());
|
||||
_canread = false;
|
||||
existingValue = Conversions.ToGenericParameter<TEvent>((SubClassType != null) ? jobj.ToObject(SubClassType, serializer) : jobj.ToObject<ADCustomEvent>(serializer));
|
||||
_canread = true;
|
||||
return existingValue;
|
||||
}
|
||||
|
||||
public virtual JObject SetSerializedObject(TEvent value, JsonSerializer serializer)
|
||||
{
|
||||
_canwrite = false;
|
||||
JObject JObj = JObject.FromObject(value, serializer);
|
||||
_canwrite = true;
|
||||
JObj.Remove("type");
|
||||
JToken s = JObj.First;
|
||||
s.AddBeforeSelf(new JProperty("eventType", value.Type.ToString()));
|
||||
return JObj;
|
||||
}
|
||||
|
||||
protected readonly ADLevel level = level;
|
||||
|
||||
protected readonly LevelReadOrWriteSettings settings = inputSettings;
|
||||
|
||||
protected bool _canread = true;
|
||||
|
||||
protected bool _canwrite = true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using RhythmBase.Adofai.Components;
|
||||
using RhythmBase.Adofai.Events;
|
||||
using RhythmBase.Adofai.Utils;
|
||||
using RhythmBase.Settings;
|
||||
namespace RhythmBase.Adofai.Converters
|
||||
{
|
||||
internal class ADBaseTileEventConverter<TEvent>(ADLevel level, LevelReadOrWriteSettings inputSettings) : ADBaseEventConverter<TEvent>(level, inputSettings) where TEvent : ADBaseTileEvent
|
||||
{
|
||||
public override TEvent GetDeserializedObject(JObject jobj, Type objectType, TEvent existingValue, bool hasExistingValue, JsonSerializer serializer)
|
||||
{
|
||||
JToken jtoken = jobj["floor"];
|
||||
int? parentIndex = (jtoken != null) ? new int?(jtoken.ToObject<int>()) : null;
|
||||
_canread = false;
|
||||
if (Utils.Utils.ADConvertToType(jobj["eventType"].ToObject<string>()) == typeof(ADCustomEvent))
|
||||
{
|
||||
existingValue = (TEvent)(object)new ADCustomTileEventConverter(level, settings).GetDeserializedObject(jobj, objectType, null, hasExistingValue, serializer);
|
||||
}
|
||||
else
|
||||
{
|
||||
jobj.Remove("floor");
|
||||
existingValue = base.GetDeserializedObject(jobj, objectType, existingValue, hasExistingValue, serializer);
|
||||
}
|
||||
_canread = true;
|
||||
if (parentIndex != null)
|
||||
{
|
||||
existingValue.Parent = level[parentIndex.Value];
|
||||
existingValue.Parent.Add((ADBaseTileEvent)(object)existingValue);
|
||||
}
|
||||
return existingValue;
|
||||
}
|
||||
public override JObject SetSerializedObject(TEvent value, JsonSerializer serializer)
|
||||
{
|
||||
JObject jobj = base.SetSerializedObject(value, serializer);
|
||||
JToken s = jobj.First;
|
||||
s.AddBeforeSelf(new JProperty("floor", level.tileOrder.IndexOf(value.Parent)));
|
||||
return jobj;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using RhythmBase.Adofai.Components;
|
||||
using RhythmBase.Adofai.Events;
|
||||
using RhythmBase.Settings;
|
||||
namespace RhythmBase.Adofai.Converters
|
||||
{
|
||||
internal class ADCustomEventConverter(ADLevel level, LevelReadOrWriteSettings settings) : ADBaseEventConverter<ADCustomEvent>(level, settings)
|
||||
{
|
||||
public override ADCustomEvent GetDeserializedObject(JObject jobj, Type objectType, ADCustomEvent existingValue, bool hasExistingValue, JsonSerializer serializer) => new()
|
||||
{
|
||||
Data = jobj
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using RhythmBase.Adofai.Components;
|
||||
using RhythmBase.Adofai.Events;
|
||||
using RhythmBase.Settings;
|
||||
namespace RhythmBase.Adofai.Converters
|
||||
{
|
||||
internal class ADCustomTileEventConverter(ADLevel level, LevelReadOrWriteSettings settings) : ADBaseTileEventConverter<ADCustomTileEvent>(level, settings)
|
||||
{
|
||||
public override ADCustomTileEvent GetDeserializedObject(JObject jobj, Type objectType, ADCustomTileEvent existingValue, bool hasExistingValue, JsonSerializer serializer) => new()
|
||||
{
|
||||
Parent = level[jobj["floor"].ToObject<int>()],
|
||||
Data = jobj
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Converters;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
using RhythmBase.Adofai.Components;
|
||||
using RhythmBase.Adofai.Events;
|
||||
using RhythmBase.Adofai.Utils;
|
||||
using RhythmBase.Extensions;
|
||||
using RhythmBase.Converters;
|
||||
using RhythmBase.Settings;
|
||||
namespace RhythmBase.Adofai.Converters
|
||||
{
|
||||
internal class ADLevelConverter(string location, LevelReadOrWriteSettings settings) : JsonConverter<ADLevel>
|
||||
{
|
||||
public override void WriteJson(JsonWriter writer, ADLevel? value, JsonSerializer serializer)
|
||||
{
|
||||
JsonSerializerSettings AllInOneSerializer = new()
|
||||
{
|
||||
ContractResolver = new CamelCasePropertyNamesContractResolver(),
|
||||
Formatting = Formatting.None
|
||||
};
|
||||
IList<JsonConverter> converters = AllInOneSerializer.Converters;
|
||||
converters.Add(new StringEnumConverter());
|
||||
converters.Add(new ColorConverter());
|
||||
writer.Formatting = settings.Indented ? Formatting.Indented : Formatting.None;
|
||||
writer.WriteStartObject();
|
||||
writer.WritePropertyName("angleData");
|
||||
writer.WriteStartArray();
|
||||
foreach (ADTile item in value!)
|
||||
writer.WriteRawValue(JsonConvert.SerializeObject(item.Angle, Formatting.None));
|
||||
writer.WriteEndArray();
|
||||
writer.WritePropertyName("settings");
|
||||
writer.WriteRawValue(JsonConvert.SerializeObject(value.Settings, Formatting.Indented, AllInOneSerializer));
|
||||
writer.WritePropertyName("actions");
|
||||
writer.WriteStartArray();
|
||||
foreach (ADTile item2 in value)
|
||||
writer.WriteRawValue(JsonConvert.SerializeObject(item2, Formatting.None, AllInOneSerializer));
|
||||
writer.WriteEndArray();
|
||||
writer.WritePropertyName("decorations");
|
||||
writer.WriteStartArray();
|
||||
foreach (ADBaseEvent item3 in value.Decorations)
|
||||
writer.WriteRawValue(JsonConvert.SerializeObject(item3, Formatting.None, AllInOneSerializer));
|
||||
writer.WriteEndArray();
|
||||
writer.WriteEndObject();
|
||||
writer.Close();
|
||||
}
|
||||
public override ADLevel ReadJson(JsonReader reader, Type objectType, ADLevel? existingValue, bool hasExistingValue, JsonSerializer serializer)
|
||||
{
|
||||
ADLevel outLevel = new()
|
||||
{
|
||||
_path = fileLocation
|
||||
};
|
||||
JsonSerializer AllInOneSerializer = outLevel.GetSerializer(settings);
|
||||
JArray JActions = [];
|
||||
JArray JDecorations = [];
|
||||
while (reader.Read())
|
||||
{
|
||||
string name = (string)reader.Value!;
|
||||
reader.Read();
|
||||
object left = name;
|
||||
switch (name)
|
||||
{
|
||||
case "settings":
|
||||
JObject jobj = JObject.Load(reader);
|
||||
outLevel.Settings = jobj.ToObject<ADSettings>(AllInOneSerializer)!;
|
||||
break;
|
||||
case "angleData":
|
||||
JArray jobj2 = JArray.Load(reader);
|
||||
//outLevel.AddRange(jobj2.ToObject<List<ADTile>>(AllInOneSerializer)!);
|
||||
break;
|
||||
case "actions":
|
||||
JActions = JArray.Load(reader);
|
||||
break;
|
||||
case "decorations":
|
||||
JDecorations = JArray.Load(reader);
|
||||
break;
|
||||
}
|
||||
}
|
||||
reader.Close();
|
||||
JActions.ToObject<List<ADBaseTileEvent>>(AllInOneSerializer);
|
||||
outLevel.Decorations.AddRange(JDecorations.ToObject<List<ADBaseEvent>>(AllInOneSerializer)!);
|
||||
return outLevel;
|
||||
}
|
||||
private readonly string fileLocation = location;
|
||||
private readonly LevelReadOrWriteSettings settings = settings;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using RhythmBase.Adofai.Components;
|
||||
using RhythmBase.Adofai.Events;
|
||||
namespace RhythmBase.Adofai.Converters
|
||||
{
|
||||
internal class ADTileConverter(ADLevel level) : JsonConverter<ADTile>
|
||||
{
|
||||
public override void WriteJson(JsonWriter writer, ADTile value, JsonSerializer serializer) => throw new NotImplementedException();
|
||||
|
||||
public override ADTile ReadJson(JsonReader reader, Type objectType, ADTile existingValue, bool hasExistingValue, JsonSerializer serializer) => new()
|
||||
{
|
||||
Angle = JToken.Load(reader).ToObject<float>(),
|
||||
Parent = level
|
||||
};
|
||||
|
||||
private readonly ADLevel level = level;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user