Exemple #1
0
        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);
        }