示例#1
0
            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);
            }
示例#2
0
        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;
        }