using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using WingsEmu.Core.Extensions; namespace WingsEmu.Game.Configurations; public interface ITimeSpaceConfiguration { TimeSpaceFileConfiguration GetTimeSpaceConfiguration(long timeSpaceId); IEnumerable GetTimeSpaceConfigurationsByMapId(int mapId); } public class TimeSpaceConfiguration : ITimeSpaceConfiguration { private readonly ImmutableDictionary _configurations; private readonly Dictionary> _configurationsByMapId = new(); public TimeSpaceConfiguration(IEnumerable configurations) { _configurations = configurations.ToImmutableDictionary(s => s.TsId); foreach (TimeSpaceFileConfiguration configuration in configurations.Where(x => x.Placement != null)) { foreach (TimeSpacePlacement placement in configuration.Placement) { if (!_configurationsByMapId.TryGetValue(placement.MapId, out List list)) { list = new List(); _configurationsByMapId[placement.MapId] = list; } list.Add(configuration); } } } public TimeSpaceFileConfiguration GetTimeSpaceConfiguration(long timeSpaceId) => _configurations.GetOrDefault(timeSpaceId); public IEnumerable GetTimeSpaceConfigurationsByMapId(int mapId) => _configurationsByMapId.GetOrDefault(mapId); } public class TimeSpaceFileConfiguration { public long TsId { get; set; } public byte MinLevel { get; set; } public byte MaxLevel { get; set; } public string Name { get; set; } public string Description { get; set; } public bool IsHero { get; set; } public bool IsSpecial { get; set; } public bool IsHidden { get; set; } public byte MinPlayers { get; set; } public byte MaxPlayers { get; set; } public byte SeedsOfPowerRequired { get; set; } public TimeSpaceRewards Rewards { get; set; } public List Placement { get; set; } public int? ReputationMultiplier { get; set; } } public class TimeSpaceRewards { public List Draw { get; set; } public List Special { get; set; } public List Bonus { get; set; } } public class TimeSpaceItemConfiguration { public short ItemVnum { get; set; } public short Amount { get; set; } } public class TimeSpacePlacement { public int MapId { get; set; } public short MapX { get; set; } public short MapY { get; set; } }