public static IReadOnlyDictionary <ItemID, Item> UpdateOrCreateMap(IReadOnlyDictionary <ItemID, Item>?sourceMap, ICollection <Initializer> initializers, IReadOnlyDictionary <AnimateID, Animate> animates) { SnapshotContainer?snapshot = null; if (sourceMap != null) { snapshot = new(); TakeSnapshots(snapshot, sourceMap); } Dictionary <ItemID, Item> items = new(initializers.Count); var compoundInitializers = new List <Initializer>(); var typedInitializers = new Dictionary <Initializer, Func <Initializer, IReadOnlyDictionary <AnimateID, Animate>, IReadOnlyDictionary <ItemID, Item>, Item> >(); foreach (var initializer in initializers) { var createMethod = GetCreateMethod(initializer.ID); if (createMethod != null) { typedInitializers[initializer] = createMethod; } else if (initializer.UsableOn != null && initializer.UsableOn.Length > 0) { if (initializer.Components != null && initializer.Components.Length == 2) { compoundInitializers.Add(initializer); } else { items[initializer.ID] = RegisterTexts(UsableItem.Create(initializer, animates), initializer); } } else { items[initializer.ID] = RegisterTexts(Create(initializer), initializer); } } foreach (var initializer in compoundInitializers) { items[initializer.ID] = RegisterTexts(CompoundItem.Create(initializer, animates, items), initializer); } foreach (var initializerMethod in typedInitializers) { var initializer = initializerMethod.Key; items[initializer.ID] = RegisterTexts(initializerMethod.Value.Invoke(initializer, animates, items), initializer); } if (snapshot != null) { RestoreSnapshots(snapshot, items); } return(items); }