添加商店和商品列表

This commit is contained in:
milimoe 2025-01-21 01:35:26 +08:00
parent f0b3d0a549
commit 7dea8032c2
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
7 changed files with 275 additions and 5 deletions

135
Entity/System/Store.cs Normal file
View File

@ -0,0 +1,135 @@
using System.Text;
using Milimoe.FunGame.Core.Interface.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Entity
{
public class Store : BaseEntity
{
public User User { get; set; } = General.UnknownUserInstance;
public DateTime? StartTime { get; set; } = null;
public DateTime? EndTime { get; set; } = null;
public Dictionary<long, Goods> Goods { get; } = [];
public Store(string name, User? user = null)
{
Name = name;
if (user != null)
{
User = user;
}
}
public override string ToString()
{
StringBuilder builder = new();
builder.AppendLine($"☆★☆ {Name} ☆★☆");
if (StartTime.HasValue && EndTime.HasValue)
{
builder.AppendLine($"营业时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)}至{EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}");
}
else if (StartTime.HasValue && !EndTime.HasValue)
{
builder.AppendLine($"开始营业时间:{StartTime.Value.ToString(General.GeneralDateTimeFormatChinese)}");
}
else if (!StartTime.HasValue && EndTime.HasValue)
{
builder.AppendLine($"停止营业时间:{EndTime.Value.ToString(General.GeneralDateTimeFormatChinese)}");
}
else
{
builder.AppendLine($"[ 24H ] 全年无休,永久开放");
}
builder.AppendLine($"☆--- 商品列表 ---☆");
foreach (Goods good in Goods.Values)
{
builder.AppendLine($"{good.Id}. {good.Name}");
builder.AppendLine($"商品描述:{good.Description}");
builder.AppendLine($"商品售价:{string.Join("", good.Prices.Select(kv => $"{kv.Value} {kv.Key}"))}");
builder.AppendLine($"包含物品:{string.Join("", good.Items.Select(i => $"[{ItemSet.GetQualityTypeName(i.QualityType)}|{ItemSet.GetItemTypeName(i.ItemType)}] {i.Name}"))}");
builder.AppendLine($"剩余库存:{good.Stock}");
}
return builder.ToString().Trim();
}
public void AddItem(Item item, int stock, string name = "", string description = "")
{
long id = Goods.Count > 0 ? Goods.Keys.Max() + 1 : 1;
if (name.Trim() == "")
{
name = item.Name;
}
if (description.Trim() == "")
{
description = item.Description;
}
Goods goods = new(id, item, stock, name, description);
if (item.Price > 0)
{
goods.SetPrice(General.GameplayEquilibriumConstant.InGameCurrency, item.Price);
}
Goods.Add(id, goods);
}
public void AddItems(IEnumerable<Item> items, int stock)
{
foreach (Item item in items)
{
AddItem(item, stock);
}
}
public override bool Equals(IBaseEntity? other)
{
return other is Store && other.GetIdName() == GetIdName();
}
}
public class Goods
{
public long Id { get; set; }
public List<Item> Items { get; }
public string Name { get; set; }
public string Description { get; set; }
public Dictionary<string, double> Prices { get; } = [];
public int Stock { get; set; }
public Goods(long id, Item item, int stock, string name, string description, Dictionary<string, double>? prices = null)
{
Id = id;
Items = [item];
Stock = stock;
Name = name;
Description = description;
if (prices != null) Prices = prices;
}
public Goods(long id, List<Item> items, int stock, string name, string description, Dictionary<string, double>? prices = null)
{
Id = id;
Items = items;
Stock = stock;
Name = name;
Description = description;
if (prices != null) Prices = prices;
}
public void SetPrice(string needy, double price)
{
Prices[needy] = price;
}
public bool GetPrice(string needy, out double price)
{
price = -1;
if (Prices.TryGetValue(needy, out double temp) && temp > 0)
{
price = temp;
return true;
}
return false;
}
}
}

View File

@ -0,0 +1,13 @@
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Library.Common.Event
{
public class UserActivityEventArgs(long userId, ActivityState activityState, DateTime startTime, DateTime endTime) : GeneralEventArgs
{
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;
}
}

View File

@ -0,0 +1,64 @@
using System.Text.Json;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Architecture;
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
{
public class GoodsConverter : BaseEntityConverter<Goods>
{
public override Goods NewInstance()
{
return new Goods(0, Factory.GetItem(), 0, "", "");
}
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Goods result, Dictionary<string, object> convertingContext)
{
switch (propertyName)
{
case nameof(Goods.Id):
result.Id = reader.GetInt64();
break;
case nameof(Goods.Items):
List<Item> items = NetworkUtility.JsonDeserialize<List<Item>>(ref reader, options) ?? [];
foreach (Item item in items)
{
result.Items.Add(item);
}
break;
case nameof(Goods.Stock):
result.Stock = reader.GetInt32();
break;
case nameof(Goods.Name):
result.Name = reader.GetString() ?? "";
break;
case nameof(Goods.Description):
result.Description = reader.GetString() ?? "";
break;
case nameof(Goods.Prices):
Dictionary<string, double> prices = NetworkUtility.JsonDeserialize<Dictionary<string, double>>(ref reader, options) ?? [];
foreach (string needy in prices.Keys)
{
result.Prices[needy] = prices[needy];
}
break;
}
}
public override void Write(Utf8JsonWriter writer, Goods value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteNumber(nameof(Goods.Id), value.Id);
writer.WritePropertyName(nameof(Goods.Items));
JsonSerializer.Serialize(writer, value.Items, options);
writer.WriteNumber(nameof(Goods.Stock), value.Stock);
writer.WriteString(nameof(Goods.Name), value.Name);
writer.WriteString(nameof(Goods.Description), value.Description);
writer.WritePropertyName(nameof(Goods.Prices));
JsonSerializer.Serialize(writer, value.Prices, options);
writer.WriteEndObject();
}
}
}

View File

@ -0,0 +1,43 @@
using System.Text.Json;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Architecture;
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
{
public class StoreConverter : BaseEntityConverter<Store>
{
public override Store NewInstance()
{
return new Store("商店");
}
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Store result, Dictionary<string, object> convertingContext)
{
switch (propertyName)
{
case nameof(Store.Name):
result.Name = reader.GetString() ?? "";
break;
case nameof(Store.Goods):
Dictionary<long, Goods> goods = NetworkUtility.JsonDeserialize<Dictionary<long, Goods>>(ref reader, options) ?? [];
foreach (long id in goods.Keys)
{
result.Goods[id] = goods[id];
}
break;
}
}
public override void Write(Utf8JsonWriter writer, Store value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteString(nameof(Store.Name), value.Name);
writer.WritePropertyName(nameof(Store.Goods));
JsonSerializer.Serialize(writer, value.Goods, options);
writer.WriteEndObject();
}
}
}

View File

@ -64,4 +64,11 @@ namespace Milimoe.FunGame.Core.Library.Constant
Critical, Critical,
Evaded Evaded
} }
public enum RedeemResult
{
Success,
StockNotEnough,
PointsNotEnough
}
} }

View File

@ -89,9 +89,17 @@ namespace Milimoe.FunGame.Core.Library.Constant
public enum QuestState public enum QuestState
{ {
NotStarted = 0, NotStarted,
InProgress = 1, InProgress,
Completed = 2, Completed,
Settled = 3 Settled
}
public enum ActivityState
{
Future,
Upcoming,
InProgress,
Ended
} }
} }

View File

@ -21,7 +21,7 @@ namespace Milimoe.FunGame.Core.Service
ReferenceHandler = ReferenceHandler.IgnoreCycles, ReferenceHandler = ReferenceHandler.IgnoreCycles,
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(), Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(),
new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(), new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(),
new InventoryConverter(), new NormalAttackConverter(), new ClubConverter() new InventoryConverter(), new NormalAttackConverter(), new ClubConverter(), new GoodsConverter(), new StoreConverter()
} }
}; };