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? 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; } } 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; Console.WriteLine($"活动状态已改变为:{newStatus}"); } } } 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; // 兑换成功 } } }