diff --git a/Library/Main.cs b/Library/Main.cs index b1622f5..a17640a 100644 --- a/Library/Main.cs +++ b/Library/Main.cs @@ -18,6 +18,8 @@ im.Load(); FunGameService.InitFunGame(); FunGameSimulation.InitFunGameSimulation(); +_ = new Milimoe.FunGame.Testing.Tests.ActivityExample(); + //List strings = FunGameSimulation.StartGame(true, false, true); //strings.ForEach(Console.WriteLine); diff --git a/Library/Solutions/Activity.cs b/Library/Solutions/Activity.cs new file mode 100644 index 0000000..5ab0048 --- /dev/null +++ b/Library/Solutions/Activity.cs @@ -0,0 +1,189 @@ +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Testing.Solutions +{ + public enum ActivityState + { + Future, + Upcoming, + InProgress, + Ended + } + + public enum RedeemResult + { + Success, + StockNotEnough, + PointsNotEnough + } + + public class Activity(long id, string name, DateTime startTime, DateTime endTime) + { + 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 ActivityState State { get; private set; } = ActivityState.Future; + public List Quests { get; set; } = []; + public Store Store { get; set; } = new Store(); + + // 事件 + public event EventHandler? ActivityStateChanged; + public event EventHandler? UserAccessCheck; + + public void UpdateState() + { + ActivityState newState; + DateTime now = DateTime.Now; + + if (now < StartTime) + { + newState = ActivityState.Future; + } + else if (now >= StartTime && now < StartTime.AddHours(1)) + { + newState = ActivityState.Upcoming; + } + else if (now >= StartTime && now < EndTime) + { + newState = ActivityState.InProgress; + } + else + { + newState = ActivityState.Ended; + } + + if (State != newState) + { + State = newState; + OnActivityStateChanged(new ActivityStateChangedEventArgs(State)); + } + } + + protected virtual void OnActivityStateChanged(ActivityStateChangedEventArgs e) + { + ActivityStateChanged?.Invoke(this, e); + } + + public bool AllowUserAccess(long userId) + { + UserAccessEventArgs args = new(userId, State, StartTime, EndTime); + UserAccessCheck?.Invoke(this, args); + return args.AllowAccess; + } + + public void AddQuest(Quest quest) + { + Quests.Add(quest); + } + + public void RemoveQuest(Quest quest) + { + Quests.Remove(quest); + } + + public void UpdateQuestStatus(long questId, QuestState newStatus) + { + var quest = Quests.FirstOrDefault(q => q.Id == questId); + if (quest != null) + { + quest.Status = newStatus; + // 可选:触发任务状态更新事件 + } + } + } + + public class ActivityStateChangedEventArgs(ActivityState newState) : EventArgs + { + public ActivityState NewState { get; } = newState; + } + + public class UserAccessEventArgs(long userId, ActivityState activityState, DateTime startTime, DateTime endTime) : EventArgs + { + public long UserId { get; } = userId; + public ActivityState ActivityState { get; } = activityState; + public DateTime StartTime { get; } = startTime; + public DateTime EndTime { get; } = endTime; + public bool AllowAccess { get; set; } = false; // 默认不允许访问 + } + + public class Points(long userId, int amount = 0) + { + public long UserId { get; set; } = userId; + public int Amount { get; set; } = amount; + + public void AddPoints(int amount) + { + Amount += amount; + } + + public void RemovePoints(int amount) + { + if (Amount >= amount) + { + Amount -= amount; + } + else + { + throw new InvalidOperationException("积分不足!"); + } + } + } + + public class Store + { + public List Items { get; set; } = []; + public Dictionary ItemPrices { get; set; } = []; // ItemId, Price + public Dictionary ItemStocks { get; set; } = []; // ItemId, Stock + + /// + /// 添加物品到商店 + /// + /// 物品 + /// 价格 + /// 库存 + public void AddItem(Item item, int price, int stock) + { + Items.Add(item); + ItemPrices[item.Id] = price; + ItemStocks[item.Id] = stock; + } + + public void RemoveItem(Item item) + { + Items.Remove(item); + ItemPrices.Remove(item.Id); + ItemStocks.Remove(item.Id); + } + + public RedeemResult TryRedeemItem(Points points, long itemId) + { + if (!ItemPrices.TryGetValue(itemId, out int price)) + { + throw new ArgumentException($"商品 {itemId} 不存在!"); + } + + if (!ItemStocks.TryGetValue(itemId, out int stock)) + { + throw new ArgumentException($"商品 {itemId} 不存在!"); + } + + if (stock <= 0) + { + return RedeemResult.StockNotEnough; // 库存不足 + } + + if (points.Amount < price) + { + return RedeemResult.PointsNotEnough; // 积分不足 + } + + points.RemovePoints(price); + ItemStocks[itemId]--; // 减少库存 + // 可选:记录兑换记录 + return RedeemResult.Success; // 兑换成功 + } + } + +} diff --git a/Library/Solutions/Person.cs b/Library/Solutions/Person.cs index 1372f51..b096f06 100644 --- a/Library/Solutions/Person.cs +++ b/Library/Solutions/Person.cs @@ -24,7 +24,7 @@ namespace ConverterExample return new(); } - public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Address result) + public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Address result, Dictionary convertingContext) { result ??= new(); switch (propertyName) @@ -57,7 +57,7 @@ namespace ConverterExample return new(); } - public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Person result) + public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Person result, Dictionary convertingContext) { result ??= new(); switch (propertyName) diff --git a/Library/Tests/ActivityExample.cs b/Library/Tests/ActivityExample.cs new file mode 100644 index 0000000..e4f7d1d --- /dev/null +++ b/Library/Tests/ActivityExample.cs @@ -0,0 +1,113 @@ +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Testing.Solutions; + +namespace Milimoe.FunGame.Testing.Tests +{ + public class ActivityExample + { + public ActivityExample() + { + // 创建活动 + Activity activity = new(1, "新年活动", new DateTime(2025, 1, 1, 0, 0, 0), new DateTime(2025, 1, 15, 23, 59, 59)); + + // 添加任务 + Quest continuousQuest = new() + { + Id = 1, + Name = "每日登录", + Description = "每日登录游戏", + EstimatedMinutes = 1, + Awards = new Dictionary { { "积分", 10 } }, + QuestType = QuestType.Continuous + }; + Quest immediateQuest = new() + { + Id = 2, + Name = "新手引导", + Description = "完成新手引导", + Awards = new Dictionary { { "积分", 20 } }, + QuestType = QuestType.Immediate + }; + Quest progressiveQuest = new() + { + Id = 3, + Name = "击败Boss", + Description = "击败Boss", + Awards = new Dictionary { { "积分", 30 } }, + QuestType = QuestType.Progressive, + MaxProgress = 10, + Progress = 5 + }; + activity.AddQuest(continuousQuest); + activity.AddQuest(immediateQuest); + activity.AddQuest(progressiveQuest); + + // 添加商店物品 + Item item1 = Factory.GetItem(); + item1.Id = 1; + item1.Name = "金币"; + item1.Description = "游戏金币"; + Item item2 = Factory.GetItem(); + item2.Id = 2; + item2.Name = "道具"; + item2.Description = "游戏道具"; + activity.Store.AddItem(item1, 100, 10); + activity.Store.AddItem(item2, 200, 10); + + // 订阅活动状态改变事件 + activity.ActivityStateChanged += (sender, e) => + { + Console.WriteLine($"活动状态已改变为:{e.NewState}"); + }; + + // 订阅用户访问检查事件 + activity.UserAccessCheck += (sender, e) => + { + if (e.ActivityState == ActivityState.InProgress) + { + e.AllowAccess = true; // 只有进行中状态才允许访问 + } + else + { + Console.WriteLine($"用户 {e.UserId} 尝试访问活动,但当前状态为 {e.ActivityState},不允许访问。"); + } + }; + + // 模拟用户访问 + long userId = 123; + Points points = new(userId, 30000); + while (true) + { + activity.UpdateState(); // 定时更新活动状态 + if (activity.AllowUserAccess(userId)) + { + Console.WriteLine(string.Join("\r\n", activity.Quests)); + + Console.WriteLine($"用户 {userId} 成功访问活动!"); + // 模拟用户兑换物品 + RedeemResult result = activity.Store.TryRedeemItem(points, 1); + switch (result) + { + case RedeemResult.Success: + Console.WriteLine($"用户 {userId} 成功兑换了 {item1.Name}!"); + break; + case RedeemResult.StockNotEnough: + Console.WriteLine($"用户 {userId} 兑换 {item1.Name} 失败,库存不足!"); + break; + case RedeemResult.PointsNotEnough: + Console.WriteLine($"用户 {userId} 兑换 {item1.Name} 失败,积分不足!"); + break; + } + + Console.WriteLine($"用户 {userId} 当前积分:{points.Amount}"); + + } + + //Thread.Sleep(1000); // 每秒检查一次 + Console.ReadLine(); + } + } + } +}