活动、任务、活动中心优化

This commit is contained in:
milimoe 2025-06-28 01:27:46 +08:00
parent 9b1a62c6bf
commit 155b846aa5
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
7 changed files with 188 additions and 28 deletions

View File

@ -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<Quest> 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<ActivityEventArgs>? 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();
}
}
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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<Activity>
{
public override Activity NewInstance()
{
return new Activity();
}
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Activity result, Dictionary<string, object> convertingContext)
{
switch (propertyName)
{
case nameof(Activity.Id):
result.Id = reader.GetInt64();
break;
case nameof(Activity.Guid):
result.Guid = NetworkUtility.JsonDeserialize<Guid>(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<Quest> quests = NetworkUtility.JsonDeserialize<List<Quest>>(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();
}
}
}

View File

@ -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 => "进行中",
_ => "已结束"
};
}
}
/// <summary>

View File

@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Model
public void AddOrUpdateEvent(string name, IEnumerable<Activity> activities)
{
Events[name] = new(activities);
Events[name] = [.. activities];
}
public bool RemoveEvent(string name)

View File

@ -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()
}
};