From b1bfcc5577b9b4aab0730f40953303c1fe7384ca Mon Sep 17 00:00:00 2001 From: milimoe Date: Sat, 19 Jul 2025 08:35:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=95=86=E5=BA=97=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Entity/Trade/Goods.cs | 2 +- Entity/Trade/Store.cs | 23 +++++++++- .../Common/JsonConverter/StoreConverter.cs | 45 +++++++++++++++++++ Model/GamingQueue.cs | 6 +-- 4 files changed, 71 insertions(+), 5 deletions(-) diff --git a/Entity/Trade/Goods.cs b/Entity/Trade/Goods.cs index e4edd6f..e00d886 100644 --- a/Entity/Trade/Goods.cs +++ b/Entity/Trade/Goods.cs @@ -41,7 +41,7 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine($"商品描述:{Description}"); builder.AppendLine($"商品售价:{(Prices.Count > 0 ? string.Join("、", Prices.Select(kv => $"{kv.Value} {kv.Key}")) : "免费")}"); builder.AppendLine($"包含物品:{string.Join("、", Items.Select(i => $"[{ItemSet.GetQualityTypeName(i.QualityType)}|{ItemSet.GetItemTypeName(i.ItemType)}] {i.Name}"))}"); - builder.AppendLine($"剩余库存:{Stock}"); + builder.AppendLine($"剩余库存:{(Stock == -1 ? "不限量提供" : Stock)}"); return builder.ToString().Trim(); } diff --git a/Entity/Trade/Store.cs b/Entity/Trade/Store.cs index 65485d1..62a8bfd 100644 --- a/Entity/Trade/Store.cs +++ b/Entity/Trade/Store.cs @@ -10,6 +10,9 @@ namespace Milimoe.FunGame.Core.Entity public DateTime? StartTime { get; set; } = null; public DateTime? EndTime { get; set; } = null; public Dictionary Goods { get; } = []; + public bool AutoRefresh { get; set; } = false; + public DateTime NextRefreshDate { get; set; } = DateTime.MinValue; + public int RefreshInterval { get; set; } = 1; // Days public Store(string name, User? user = null) { @@ -27,7 +30,7 @@ namespace Milimoe.FunGame.Core.Entity builder.AppendLine($"☆★☆ {Name} ☆★☆"); if (StartTime.HasValue && EndTime.HasValue) { - builder.AppendLine($"营业时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)}至{EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"); + builder.AppendLine($"营业时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)} 至 {EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}"); } else if (StartTime.HasValue && !EndTime.HasValue) { @@ -46,6 +49,11 @@ namespace Milimoe.FunGame.Core.Entity { builder.AppendLine(goods.ToString()); } + builder.AppendLine("提示:使用【商店查看+序号】查看物品详细信息,使用【商店购买+序号】购买物品(指令在 2 分钟内可用)。"); + if (AutoRefresh) + { + builder.AppendLine($"商品将在 {NextRefreshDate.ToString(General.GeneralDateTimeFormatChinese)} 刷新。"); + } return builder.ToString().Trim(); } @@ -102,6 +110,19 @@ namespace Milimoe.FunGame.Core.Entity return price; } + public void UpdateRefreshTime(DateTime? time = null) + { + if (AutoRefresh) + { + time ??= DateTime.Now; + NextRefreshDate = time.Value.AddDays(RefreshInterval); + } + else + { + NextRefreshDate = DateTime.MinValue; + } + } + public override bool Equals(IBaseEntity? other) { return other is Store && other.GetIdName() == GetIdName(); diff --git a/Library/Common/JsonConverter/StoreConverter.cs b/Library/Common/JsonConverter/StoreConverter.cs index 18d5197..bf0bf29 100644 --- a/Library/Common/JsonConverter/StoreConverter.cs +++ b/Library/Common/JsonConverter/StoreConverter.cs @@ -2,6 +2,7 @@ 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 { @@ -19,6 +20,28 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Store.Name): result.Name = reader.GetString() ?? ""; break; + case nameof(Store.StartTime): + string dateString = reader.GetString() ?? ""; + if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime time)) + { + result.StartTime = time; + } + else + { + result.StartTime = DateTime.MinValue; + } + break; + case nameof(Store.EndTime): + dateString = reader.GetString() ?? ""; + if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out time)) + { + result.EndTime = time; + } + else + { + result.EndTime = DateTime.MinValue; + } + break; case nameof(Store.Goods): Dictionary goods = NetworkUtility.JsonDeserialize>(ref reader, options) ?? []; foreach (long id in goods.Keys) @@ -26,6 +49,23 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter result.Goods[id] = goods[id]; } break; + case nameof(Store.AutoRefresh): + result.AutoRefresh = reader.GetBoolean(); + break; + case nameof(Store.NextRefreshDate): + dateString = reader.GetString() ?? ""; + if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out time)) + { + result.NextRefreshDate = time; + } + else + { + result.NextRefreshDate = DateTime.MinValue; + } + break; + case nameof(Store.RefreshInterval): + result.RefreshInterval = Convert.ToInt32(reader.GetInt64()); + break; } } @@ -34,8 +74,13 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter writer.WriteStartObject(); writer.WriteString(nameof(Store.Name), value.Name); + if (value.StartTime.HasValue) writer.WriteString(nameof(Store.StartTime), value.StartTime.Value.ToString(General.GeneralDateTimeFormat)); + if (value.EndTime.HasValue) writer.WriteString(nameof(Store.EndTime), value.EndTime.Value.ToString(General.GeneralDateTimeFormat)); writer.WritePropertyName(nameof(Store.Goods)); JsonSerializer.Serialize(writer, value.Goods, options); + writer.WriteBoolean(nameof(Store.AutoRefresh), value.AutoRefresh); + writer.WriteString(nameof(Store.NextRefreshDate), value.NextRefreshDate.ToString(General.GeneralDateTimeFormat)); + writer.WriteNumber(nameof(Store.RefreshInterval), value.RefreshInterval); writer.WriteEndObject(); } diff --git a/Model/GamingQueue.cs b/Model/GamingQueue.cs index 4be0104..27ac7c0 100644 --- a/Model/GamingQueue.cs +++ b/Model/GamingQueue.cs @@ -589,9 +589,9 @@ namespace Milimoe.FunGame.Core.Model // 统计 _stats[character].LiveRound += 1; _stats[character].LiveTime += timeToReduce; - _stats[character].DamagePerRound = _stats[character].TotalDamage / _stats[character].LiveRound; - _stats[character].DamagePerTurn = _stats[character].TotalDamage / _stats[character].ActionTurn; - _stats[character].DamagePerSecond = _stats[character].TotalDamage / _stats[character].LiveTime; + _stats[character].DamagePerRound = _stats[character].LiveRound == 0 ? 0 : _stats[character].TotalDamage / _stats[character].LiveRound; + _stats[character].DamagePerTurn = _stats[character].ActionTurn == 0 ? 0 : _stats[character].TotalDamage / _stats[character].ActionTurn; + _stats[character].DamagePerSecond = _stats[character].LiveTime == 0 ? 0 : _stats[character].TotalDamage / _stats[character].LiveTime; // 回血回蓝 double recoveryHP = character.HR * timeToReduce;