mirror of
https://github.com/milimoe/FunGame-Testing.git
synced 2025-04-21 11:49:34 +08:00
修复生命值回复问题
This commit is contained in:
parent
4a138031a1
commit
7a565b0a33
@ -18,6 +18,8 @@ im.Load();
|
|||||||
FunGameService.InitFunGame();
|
FunGameService.InitFunGame();
|
||||||
FunGameSimulation.InitFunGameSimulation();
|
FunGameSimulation.InitFunGameSimulation();
|
||||||
|
|
||||||
|
_ = new Milimoe.FunGame.Testing.Tests.ActivityExample();
|
||||||
|
|
||||||
//List<string> strings = FunGameSimulation.StartGame(true, false, true);
|
//List<string> strings = FunGameSimulation.StartGame(true, false, true);
|
||||||
//strings.ForEach(Console.WriteLine);
|
//strings.ForEach(Console.WriteLine);
|
||||||
|
|
||||||
|
189
Library/Solutions/Activity.cs
Normal file
189
Library/Solutions/Activity.cs
Normal file
@ -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<Quest> Quests { get; set; } = [];
|
||||||
|
public Store Store { get; set; } = new Store();
|
||||||
|
|
||||||
|
// 事件
|
||||||
|
public event EventHandler<ActivityStateChangedEventArgs>? ActivityStateChanged;
|
||||||
|
public event EventHandler<UserAccessEventArgs>? 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<Item> Items { get; set; } = [];
|
||||||
|
public Dictionary<long, int> ItemPrices { get; set; } = []; // ItemId, Price
|
||||||
|
public Dictionary<long, int> ItemStocks { get; set; } = []; // ItemId, Stock
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加物品到商店
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">物品</param>
|
||||||
|
/// <param name="price">价格</param>
|
||||||
|
/// <param name="stock">库存</param>
|
||||||
|
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; // 兑换成功
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -24,7 +24,7 @@ namespace ConverterExample
|
|||||||
return new();
|
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<string, object> convertingContext)
|
||||||
{
|
{
|
||||||
result ??= new();
|
result ??= new();
|
||||||
switch (propertyName)
|
switch (propertyName)
|
||||||
@ -57,7 +57,7 @@ namespace ConverterExample
|
|||||||
return new();
|
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<string, object> convertingContext)
|
||||||
{
|
{
|
||||||
result ??= new();
|
result ??= new();
|
||||||
switch (propertyName)
|
switch (propertyName)
|
||||||
|
113
Library/Tests/ActivityExample.cs
Normal file
113
Library/Tests/ActivityExample.cs
Normal file
@ -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<string, int> { { "积分", 10 } },
|
||||||
|
QuestType = QuestType.Continuous
|
||||||
|
};
|
||||||
|
Quest immediateQuest = new()
|
||||||
|
{
|
||||||
|
Id = 2,
|
||||||
|
Name = "新手引导",
|
||||||
|
Description = "完成新手引导",
|
||||||
|
Awards = new Dictionary<string, int> { { "积分", 20 } },
|
||||||
|
QuestType = QuestType.Immediate
|
||||||
|
};
|
||||||
|
Quest progressiveQuest = new()
|
||||||
|
{
|
||||||
|
Id = 3,
|
||||||
|
Name = "击败Boss",
|
||||||
|
Description = "击败Boss",
|
||||||
|
Awards = new Dictionary<string, int> { { "积分", 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user