Esempio n. 1
0
        public Ob_Trigger GetObjectBuilder()
        {
            var any = new Ob_Trigger_Any()
            {
                Elements = new List <Ob_Trigger>(Branches.Count)
            };

            foreach (var branch in Branches)
            {
                var all = new Ob_Trigger_All()
                {
                    Elements = new List <Ob_Trigger>(branch.ResearchStates.Count + branch.Unlocked.Count +
                                                     branch.StatefulTriggers.Count)
                };
                foreach (var state in branch.ResearchStates)
                {
                    all.Elements.Add(new Ob_Trigger_ResearchState()
                    {
                        Id = state.Key, RequiredState = state.Value
                    });
                }
                foreach (var unlock in branch.Unlocked)
                {
                    all.Elements.Add(new Ob_Trigger_Unlocked()
                    {
                        DefinitionId = unlock
                    });
                }
                all.Elements.AddRange(branch.StatefulTriggers.Select(StateStorageProvider));
                any.Elements.Add(all);
            }
            return(any.Simplify());
        }
Esempio n. 2
0
            public void Add(Ob_ResearchDefinition ob)
            {
                if (_dest.Id == null)
                {
                    _dest.Id = ob.Id;
                }
                if (!string.IsNullOrWhiteSpace(ob.DisplayName))
                {
                    _dest.DisplayName = ob.DisplayName;
                }
                if (!string.IsNullOrWhiteSpace(ob.Description))
                {
                    _dest.Description = ob.Description;
                }
                if (_dest.Trigger?.Elements == null || _dest.Trigger.Simplify() == null)
                {
                    _dest.Trigger = ob.Trigger;
                }
                if (ob.AutoStart.HasValue)
                {
                    _dest.AutoStart = ob.AutoStart;
                }
                if (!string.IsNullOrWhiteSpace(ob.CompletionMessage))
                {
                    _dest.CompletionMessage = ob.CompletionMessage;
                }
                if (ob.ShowCompletionWindow.HasValue)
                {
                    _dest.ShowCompletionWindow = ob.ShowCompletionWindow;
                }
                if (ob.UpdatesAsNotifications.HasValue)
                {
                    _dest.UpdatesAsNotifications = ob.UpdatesAsNotifications;
                }
                if (ob.Hidden.HasValue)
                {
                    _dest.Hidden = ob.Hidden;
                }
                else if (ob.Trigger?.Simplify() != null)
                {
                    switch (_dest.TriggerMergeStrategy)
                    {
                    case LogicalMergeStrategy.Overwrite:
                        _dest.Trigger = ob.Trigger;
                        break;

                    case LogicalMergeStrategy.And:
                        _dest.Trigger.Elements.AddRange(ob.Trigger.Elements);
                        break;

                    case LogicalMergeStrategy.Any:
                        var anyDest    = _dest.Trigger?.Simplify();
                        var anySrc     = ob.Trigger.Simplify();
                        var anyDestAny = anyDest as Ob_Trigger_Any;
                        var anySrcAny  = anySrc as Ob_Trigger_Any;
                        if (anyDestAny != null && anySrcAny != null)
                        {
                            anyDestAny.Elements.AddRange(anySrcAny.Elements);
                            break;
                        }
                        else if (anyDestAny != null)
                        {
                            anyDestAny.Elements.Add(anySrc);
                            break;
                        }
                        if (anySrcAny != null)
                        {
                            anySrcAny.Elements.Add(anyDest);
                        }
                        else
                        {
                            anySrcAny = new Ob_Trigger_Any
                            {
                                Elements = new List <Ob_Trigger>
                                {
                                    anyDest,
                                    anySrc
                                }
                            };
                        }
                        _dest.Trigger = new Ob_Trigger_All
                        {
                            Elements = new List <Ob_Trigger> {
                                anySrcAny
                            }
                        };
                        break;

                    default:
                        throw new InvalidOperationException($"Enum {_dest.TriggerMergeStrategy} out of range");
                    }
                }
                if (_dest.Unlocks == null || _dest.Unlocks.Count == 0)
                {
                    _dest.Unlocks = ob.Unlocks;
                }
                else if (ob.Unlocks != null && ob.Unlocks.Count > 0)
                {
                    switch (ob.UnlockMergeStrategy)
                    {
                    case ListMergeStrategy.Overwrite:
                        _dest.Unlocks = ob.Unlocks;
                        break;

                    case ListMergeStrategy.Add:
                        foreach (var k in ob.Unlocks)
                        {
                            if (!_dest.Unlocks.Contains(k))
                            {
                                _dest.Unlocks.Add(k);
                            }
                        }
                        break;

                    case ListMergeStrategy.Remove:
                        foreach (var k in ob.Unlocks)
                        {
                            _dest.Unlocks.Remove(k);
                        }
                        break;

                    default:
                        throw new InvalidOperationException($"Enum {_dest.UnlockMergeStrategy} out of range");
                    }
                }
            }