public ResearchBranch Fork() { var res = new ResearchBranch(); foreach (var kv in ResearchStates) { res.ResearchStates.Add(kv.Key, kv.Value); } foreach (var k in Unlocked) { res.Unlocked.Add(k); } foreach (var kv in Triggers) { res.Triggers.Add(kv.Key, kv.Value); } return(res); }
private void FlattenResearch(Ob_Trigger trigger, ISet <ResearchBranch> branches, ResearchBranch currentBranch) { if (trigger is Ob_Trigger_Composite) { trigger = ((Ob_Trigger_Composite)trigger).Simplify(); } if (trigger == null) { return; } trigger.UpdateKey(); var all = trigger as Ob_Trigger_All; var any = trigger as Ob_Trigger_Any; var research = trigger as Ob_Trigger_ResearchState; var unlock = trigger as Ob_Trigger_Unlocked; if (all != null) { foreach (var e in all.Elements.Distinct()) { FlattenResearch(e, branches, currentBranch); } return; } if (any != null) { foreach (var e in any.Elements.Distinct()) { FlattenResearch(e, branches, currentBranch.Fork()); } return; } branches.Add(currentBranch); if (research != null) { ResearchState currentVal = currentBranch.ResearchStates.GetValueOrDefault(research.Id, research.RequiredState); Utilities.Assert(currentVal == research.RequiredState, $"Research state mismatch: {currentVal} and {research.RequiredState}"); currentBranch.ResearchStates[research.Id] = research.RequiredState; return; } if (unlock != null) { currentBranch.Unlocked.Add(unlock.DefinitionId); return; } var hasItem = trigger as Ob_Trigger_HasItem; if (hasItem != null && !Utilities.ValidateDefinition <MyPhysicalItemDefinition>(hasItem.DefinitionId)) { return; } var interact = trigger as Ob_Trigger_Interact; if (interact != null) { var valid = true; foreach (var k in interact.HandItem) { valid &= Utilities.ValidateDefinition <MyPhysicalItemDefinition>(k); } foreach (var k in interact.BlockInteractTarget) { valid &= Utilities.ValidateDefinition <MyCubeBlockDefinition>(k); } if (!valid) { return; } } var key = trigger.StateStorageKey; Utilities.Assert(key != null, $"Trigger type {trigger.GetType().FullName} must have a state storage key"); Ob_Trigger existingTrigger; if (!_stateStorageProviders.TryGetValue(key, out existingTrigger)) { _stateStorageProviders[key] = existingTrigger = trigger; } currentBranch.Triggers[key] = existingTrigger; }