Files
zfxaction26_1/godot/scripts/content/ContentRegistry.cs

130 lines
6.9 KiB
C#

#nullable enable
using System.Collections.Generic;
using System.Linq;
using SideScrollerGame.Content.Definitions;
namespace SideScrollerGame.Content;
public sealed class ContentRegistry
{
public ContentRegistry(IEnumerable<MissionDefinition> missions, IEnumerable<DifficultyDefinition> difficulties, IEnumerable<CameraPathDefinition> cameraPaths, IEnumerable<LevelLayerDefinition> levelLayers, IEnumerable<EnemyTypeDefinition> enemyTypes, IEnumerable<EnemyBehaviorDefinition> enemyBehaviors, IEnumerable<EnemyClusterDefinition> enemyClusters, IEnumerable<CollectibleDefinition> collectibles, IEnumerable<WeaponDefinition> weapons, IEnumerable<SpecialWeaponDefinition> specialWeapons, IEnumerable<SquadronMateTypeDefinition> 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<string> AllDefinitionIds()
{
return AllDefinitions().Select(definition => definition.Id).OrderBy(id => id);
}
public IReadOnlyList<DefinitionEntry> 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<MissionDefinition> MissionDefinitions { get; }
public IReadOnlyList<DifficultyDefinition> DifficultyDefinitions { get; }
public IReadOnlyList<CameraPathDefinition> CameraPathDefinitions { get; }
public IReadOnlyList<LevelLayerDefinition> LevelLayerDefinitions { get; }
public IReadOnlyList<EnemyTypeDefinition> EnemyTypeDefinitions { get; }
public IReadOnlyList<EnemyBehaviorDefinition> EnemyBehaviorDefinitions { get; }
public IReadOnlyList<EnemyClusterDefinition> EnemyClusterDefinitions { get; }
public IReadOnlyList<CollectibleDefinition> CollectibleDefinitions { get; }
public IReadOnlyList<WeaponDefinition> WeaponDefinitions { get; }
public IReadOnlyList<SpecialWeaponDefinition> SpecialWeaponDefinitions { get; }
public IReadOnlyList<SquadronMateTypeDefinition> SquadronMateTypeDefinitions { get; }
public IReadOnlyDictionary<string, MissionDefinition> Missions { get; }
public IReadOnlyDictionary<string, DifficultyDefinition> Difficulties { get; }
public IReadOnlyDictionary<string, CameraPathDefinition> CameraPaths { get; }
public IReadOnlyDictionary<string, LevelLayerDefinition> LevelLayers { get; }
public IReadOnlyDictionary<string, EnemyTypeDefinition> EnemyTypes { get; }
public IReadOnlyDictionary<string, EnemyBehaviorDefinition> EnemyBehaviors { get; }
public IReadOnlyDictionary<string, EnemyClusterDefinition> EnemyClusters { get; }
public IReadOnlyDictionary<string, CollectibleDefinition> Collectibles { get; }
public IReadOnlyDictionary<string, WeaponDefinition> Weapons { get; }
public IReadOnlyDictionary<string, SpecialWeaponDefinition> SpecialWeapons { get; }
public IReadOnlyDictionary<string, SquadronMateTypeDefinition> SquadronMateTypes { get; }
private static IReadOnlyDictionary<string, TDefinition> ToDictionary<TDefinition>(IEnumerable<TDefinition> definitions) where TDefinition : class
{
return definitions.GroupBy(GetId).Select(group => group.First()).ToDictionary(GetId);
}
private static string GetId<TDefinition>(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
};
}
}