#nullable enable using System.Collections.Generic; using System.Linq; using SideScrollerGame.Content.Definitions; namespace SideScrollerGame.Content; public sealed class ContentRegistry { public ContentRegistry(IEnumerable missions, IEnumerable difficulties, IEnumerable cameraPaths, IEnumerable levelLayers, IEnumerable enemyTypes, IEnumerable enemyBehaviors, IEnumerable enemyClusters, IEnumerable collectibles, IEnumerable weapons, IEnumerable specialWeapons, IEnumerable squadronMateTypes) { MissionDefinitions = missions.ToList(); DifficultyDefinitions = difficulties.ToList(); CameraPathDefinitions = cameraPaths.ToList(); LevelLayerDefinitions = levelLayers.ToList(); EnemyTypeDefinitions = enemyTypes.ToList(); EnemyBehaviorDefinitions = enemyBehaviors.ToList(); EnemyClusterDefinitions = enemyClusters.ToList(); CollectibleDefinitions = collectibles.ToList(); WeaponDefinitions = weapons.ToList(); SpecialWeaponDefinitions = specialWeapons.ToList(); SquadronMateTypeDefinitions = squadronMateTypes.ToList(); Missions = ToDictionary(MissionDefinitions); Difficulties = ToDictionary(DifficultyDefinitions); CameraPaths = ToDictionary(CameraPathDefinitions); LevelLayers = ToDictionary(LevelLayerDefinitions); EnemyTypes = ToDictionary(EnemyTypeDefinitions); EnemyBehaviors = ToDictionary(EnemyBehaviorDefinitions); EnemyClusters = ToDictionary(EnemyClusterDefinitions); Collectibles = ToDictionary(CollectibleDefinitions); Weapons = ToDictionary(WeaponDefinitions); SpecialWeapons = ToDictionary(SpecialWeaponDefinitions); SquadronMateTypes = ToDictionary(SquadronMateTypeDefinitions); } public IEnumerable AllDefinitionIds() { return AllDefinitions().Select(definition => definition.Id).OrderBy(id => id); } public IReadOnlyList AllDefinitions() { return MissionDefinitions.Select(definition => new DefinitionEntry("Mission", definition.Id)).Concat(DifficultyDefinitions.Select(definition => new DefinitionEntry("Difficulty", definition.Id))).Concat(CameraPathDefinitions.Select(definition => new DefinitionEntry("CameraPath", definition.Id))).Concat(LevelLayerDefinitions.Select(definition => new DefinitionEntry("LevelLayer", definition.Id))).Concat(EnemyTypeDefinitions.Select(definition => new DefinitionEntry("EnemyType", definition.Id))).Concat(EnemyBehaviorDefinitions.Select(definition => new DefinitionEntry("EnemyBehavior", definition.Id))).Concat(EnemyClusterDefinitions.Select(definition => new DefinitionEntry("EnemyCluster", definition.Id))).Concat(CollectibleDefinitions.Select(definition => new DefinitionEntry("Collectible", definition.Id))).Concat(WeaponDefinitions.Select(definition => new DefinitionEntry("Weapon", definition.Id))).Concat(SpecialWeaponDefinitions.Select(definition => new DefinitionEntry("SpecialWeapon", definition.Id))).Concat(SquadronMateTypeDefinitions.Select(definition => new DefinitionEntry("SquadronMateType", definition.Id))).OrderBy(definition => definition.Id).ToList(); } public bool TryGetMission(string id, out MissionDefinition? definition) { return Missions.TryGetValue(id, out definition); } public bool TryGetDifficulty(string id, out DifficultyDefinition? definition) { return Difficulties.TryGetValue(id, out definition); } public bool TryGetEnemyType(string id, out EnemyTypeDefinition? definition) { return EnemyTypes.TryGetValue(id, out definition); } public IReadOnlyList MissionDefinitions { get; } public IReadOnlyList DifficultyDefinitions { get; } public IReadOnlyList CameraPathDefinitions { get; } public IReadOnlyList LevelLayerDefinitions { get; } public IReadOnlyList EnemyTypeDefinitions { get; } public IReadOnlyList EnemyBehaviorDefinitions { get; } public IReadOnlyList EnemyClusterDefinitions { get; } public IReadOnlyList CollectibleDefinitions { get; } public IReadOnlyList WeaponDefinitions { get; } public IReadOnlyList SpecialWeaponDefinitions { get; } public IReadOnlyList SquadronMateTypeDefinitions { get; } public IReadOnlyDictionary Missions { get; } public IReadOnlyDictionary Difficulties { get; } public IReadOnlyDictionary CameraPaths { get; } public IReadOnlyDictionary LevelLayers { get; } public IReadOnlyDictionary EnemyTypes { get; } public IReadOnlyDictionary EnemyBehaviors { get; } public IReadOnlyDictionary EnemyClusters { get; } public IReadOnlyDictionary Collectibles { get; } public IReadOnlyDictionary Weapons { get; } public IReadOnlyDictionary SpecialWeapons { get; } public IReadOnlyDictionary SquadronMateTypes { get; } private static IReadOnlyDictionary ToDictionary(IEnumerable definitions) where TDefinition : class { return definitions.GroupBy(GetId).Select(group => group.First()).ToDictionary(GetId); } private static string GetId(TDefinition definition) { return definition switch { MissionDefinition mission => mission.Id, DifficultyDefinition difficulty => difficulty.Id, CameraPathDefinition cameraPath => cameraPath.Id, LevelLayerDefinition levelLayer => levelLayer.Id, EnemyTypeDefinition enemyType => enemyType.Id, EnemyBehaviorDefinition enemyBehavior => enemyBehavior.Id, EnemyClusterDefinition enemyCluster => enemyCluster.Id, CollectibleDefinition collectible => collectible.Id, WeaponDefinition weapon => weapon.Id, SpecialWeaponDefinition specialWeapon => specialWeapon.Id, SquadronMateTypeDefinition squadronMateDefinition => squadronMateDefinition.Id, _ => string.Empty }; } }