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()); }
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"); } } }