diff --git a/Entity/System/Activity.cs b/Entity/System/Activity.cs index e471d17..bee181f 100644 --- a/Entity/System/Activity.cs +++ b/Entity/System/Activity.cs @@ -1,17 +1,29 @@ using System.Text; +using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Common.Event; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Entity { - public class Activity(long id, string name, DateTime startTime, DateTime endTime) + public class Activity : BaseEntity { - public long Id { get; set; } = id; - public string Name { get; set; } = name; - public DateTime StartTime { get; set; } = startTime; - public DateTime EndTime { get; set; } = endTime; + public DateTime? StartTime { get; set; } = null; + public DateTime? EndTime { get; set; } = null; + public string Description { get; set; } = ""; public ActivityState Status { get; private set; } = ActivityState.Future; public HashSet Quests { get; set; } = []; + public long Predecessor { get; set; } = -1; + public ActivityState PredecessorStatus { get; set; } = ActivityState.Future; + + public Activity(long id, string name, DateTime? startTime = null, DateTime? endTime = null) + { + Id = id; + Name = name; + StartTime = startTime; + EndTime = endTime; + } + + public Activity() { } // 事件 public event Action? UserAccess; @@ -31,17 +43,25 @@ namespace Milimoe.FunGame.Core.Entity { ActivityState newState; DateTime now = DateTime.Now; - DateTime upComingTime = StartTime.AddHours(-6); + DateTime? upComingTime = StartTime?.AddHours(-6); - if (now < upComingTime) + if (Predecessor != -1 && PredecessorStatus != ActivityState.Ended) + { + // 如果有前置活动且前置活动未结束,则当前活动状态为未来 + newState = ActivityState.Future; + Status = newState; + return; + } + + if (upComingTime != null && now < upComingTime) { newState = ActivityState.Future; } - else if (now >= upComingTime && now < StartTime) + else if (upComingTime != null && now >= upComingTime && now < StartTime) { newState = ActivityState.Upcoming; } - else if (now >= StartTime && now < EndTime) + else if ((StartTime is null || now >= StartTime) && (EndTime is null || now < EndTime)) { newState = ActivityState.InProgress; } @@ -93,17 +113,10 @@ namespace Milimoe.FunGame.Core.Entity UpdateState(); StringBuilder builder = new(); - builder.AppendLine($"☆--- [{Name}] ---☆"); - string status = Status switch - { - ActivityState.Future => "预告中", - ActivityState.Upcoming => "即将开始", - ActivityState.InProgress => "进行中", - _ => "已结束" - }; - builder.AppendLine($"活动状态:{status}"); - builder.AppendLine($"开始时间:{StartTime.ToString(General.GeneralDateTimeFormatChinese)}"); - builder.AppendLine($"结束时间:{EndTime.ToString(General.GeneralDateTimeFormatChinese)}"); + builder.AppendLine($"☆--- {Name} ---☆"); + builder.AppendLine($"{Description}"); + builder.AppendLine($"活动状态:{CommonSet.GetActivityStatus(Status)}"); + builder.AppendLine(GetTimeString()); if (showQuests && Quests.Count > 0) { @@ -114,9 +127,53 @@ namespace Milimoe.FunGame.Core.Entity return builder.ToString().Trim(); } + public string GetTimeString(bool full = true) + { + if (Predecessor != -1 && PredecessorStatus != ActivityState.Ended) + { + return $"在前置活动结束后开启"; + } + if (full) + { + if (StartTime != null && EndTime != null) + { + return $"开始时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)}\r\n结束时间:{EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"; + } + else if (StartTime != null && EndTime is null) + { + return $"活动时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 起"; + } + else if (StartTime is null && EndTime != null) + { + return $"活动将在 {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 结束"; + } + } + else + { + if (StartTime != null && EndTime != null) + { + return $"活动时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} - {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"; + } + else if (StartTime != null && EndTime is null) + { + return $"活动时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 起"; + } + else if (StartTime is null && EndTime != null) + { + return $"截止于 {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"; + } + } + return "活动时间:长期"; + } + public override string ToString() { return ToString(true); } + + public override bool Equals(IBaseEntity? other) + { + return other is Activity && GetIdName() == other?.GetIdName(); + } } } diff --git a/Entity/System/Quest.cs b/Entity/System/Quest.cs index 5a7c2a1..9ef1570 100644 --- a/Entity/System/Quest.cs +++ b/Entity/System/Quest.cs @@ -6,7 +6,7 @@ namespace Milimoe.FunGame.Core.Entity public class Quest : BaseEntity { public string Description { get; set; } = ""; - public QuestState Status { get; set; } = 0; + public QuestState Status { get; set; } = QuestState.NotStarted; public long CharacterId { get; set; } = 0; public long RegionId { get; set; } = 0; public double CreditsAward { get; set; } = 0; @@ -28,7 +28,12 @@ namespace Milimoe.FunGame.Core.Entity } foreach (Item item in Awards) { - awards.Add($"[{ItemSet.GetQualityTypeName(item.QualityType)}|{ItemSet.GetItemTypeName(item.ItemType)}] {item.Name} * {AwardsCount[item.Name]}"); + int count = 1; + if (AwardsCount.TryGetValue(item.Name, out int value)) + { + count = value; + } + awards.Add($"[{ItemSet.GetQualityTypeName(item.QualityType)}|{ItemSet.GetItemTypeName(item.ItemType)}] {item.Name} * {count}"); } return string.Join(",", awards); } diff --git a/Library/Common/Event/UserActivityEventArgs.cs b/Library/Common/Event/UserActivityEventArgs.cs index 7f12986..274f068 100644 --- a/Library/Common/Event/UserActivityEventArgs.cs +++ b/Library/Common/Event/UserActivityEventArgs.cs @@ -9,8 +9,8 @@ namespace Milimoe.FunGame.Core.Library.Common.Event public long QuestId { get; } = questId; public Activity Activity { get; } = activity; public ActivityState ActivityState { get; } = activity.Status; - public DateTime StartTime { get; } = activity.StartTime; - public DateTime EndTime { get; } = activity.EndTime; + public DateTime? StartTime { get; } = activity.StartTime; + public DateTime? EndTime { get; } = activity.EndTime; public bool AllowAccess { get; set; } = false; } } diff --git a/Library/Common/JsonConverter/ActivityConverter.cs b/Library/Common/JsonConverter/ActivityConverter.cs new file mode 100644 index 0000000..bfd2d78 --- /dev/null +++ b/Library/Common/JsonConverter/ActivityConverter.cs @@ -0,0 +1,88 @@ +using System.Text.Json; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Common.Architecture; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Core.Library.Common.JsonConverter +{ + public class ActivityConverter : BaseEntityConverter + { + public override Activity NewInstance() + { + return new Activity(); + } + + public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Activity result, Dictionary convertingContext) + { + switch (propertyName) + { + case nameof(Activity.Id): + result.Id = reader.GetInt64(); + break; + case nameof(Activity.Guid): + result.Guid = NetworkUtility.JsonDeserialize(ref reader, options); + break; + case nameof(Activity.Name): + result.Name = reader.GetString() ?? ""; + break; + case nameof(Activity.Description): + result.Description = reader.GetString() ?? ""; + break; + case nameof(Activity.StartTime): + string startTimeStr = reader.GetString() ?? ""; + if (DateTime.TryParseExact(startTimeStr, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime startTime)) + { + result.StartTime = startTime; + } + result.UpdateState(); + break; + case nameof(Activity.EndTime): + string endTimeStr = reader.GetString() ?? ""; + if (DateTime.TryParseExact(endTimeStr, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime endTime)) + { + result.EndTime = endTime; + } + result.UpdateState(); + break; + case nameof(Activity.Quests): + List quests = NetworkUtility.JsonDeserialize>(ref reader, options) ?? []; + foreach (Quest quest in quests) + { + result.Quests.Add(quest); + } + break; + case nameof(Activity.Predecessor): + result.Predecessor = reader.GetInt64(); + result.UpdateState(); + break; + case nameof(Activity.PredecessorStatus): + result.PredecessorStatus = (ActivityState)reader.GetInt32(); + result.UpdateState(); + break; + } + } + + public override void Write(Utf8JsonWriter writer, Activity value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WriteNumber(nameof(Activity.Id), value.Id); + if (value.Guid != Guid.Empty) + { + writer.WritePropertyName(nameof(Activity.Guid)); + JsonSerializer.Serialize(writer, value.Guid, options); + } + writer.WriteString(nameof(Activity.Name), value.Name); + writer.WriteString(nameof(Activity.Description), value.Description); + if (value.StartTime != null) writer.WriteString(nameof(Activity.StartTime), value.StartTime.Value.ToString(General.GeneralDateTimeFormat)); + if (value.EndTime != null) writer.WriteString(nameof(Activity.EndTime), value.EndTime.Value.ToString(General.GeneralDateTimeFormat)); + writer.WritePropertyName(nameof(Activity.Quests)); + JsonSerializer.Serialize(writer, value.Quests, options); + writer.WriteNumber(nameof(Activity.Predecessor), value.Predecessor); + writer.WriteNumber(nameof(Activity.PredecessorStatus), (int)value.PredecessorStatus); + + writer.WriteEndObject(); + } + } +} diff --git a/Library/Constant/ConstantSet.cs b/Library/Constant/ConstantSet.cs index 293e36e..06629e1 100644 --- a/Library/Constant/ConstantSet.cs +++ b/Library/Constant/ConstantSet.cs @@ -1,5 +1,4 @@ - -using Milimoe.FunGame.Core.Model; +using Milimoe.FunGame.Core.Model; /** * 此文件用于保存字符串常量(String Set) @@ -33,6 +32,17 @@ namespace Milimoe.FunGame.Core.Library.Constant _ => "未开始" }; } + + public static string GetActivityStatus(ActivityState status) + { + return status switch + { + ActivityState.Future => "预告中", + ActivityState.Upcoming => "即将开始", + ActivityState.InProgress => "进行中", + _ => "已结束" + }; + } } /// diff --git a/Model/EventCenter.cs b/Model/EventCenter.cs index b463ead..6276d6b 100644 --- a/Model/EventCenter.cs +++ b/Model/EventCenter.cs @@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Model public void AddOrUpdateEvent(string name, IEnumerable activities) { - Events[name] = new(activities); + Events[name] = [.. activities]; } public bool RemoveEvent(string name) diff --git a/Service/JsonManager.cs b/Service/JsonManager.cs index af6733b..d8d614b 100644 --- a/Service/JsonManager.cs +++ b/Service/JsonManager.cs @@ -22,7 +22,7 @@ namespace Milimoe.FunGame.Core.Service Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(), new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(), new InventoryConverter(), new NormalAttackConverter(), new ClubConverter(), new GoodsConverter(), new StoreConverter(), - new NovelOptionConverter(), new NovelNodeConverter(), new ShieldConverter(), new RoundRecordConverter() + new NovelOptionConverter(), new NovelNodeConverter(), new ShieldConverter(), new RoundRecordConverter(), new ActivityConverter() } };