Пример #1
0
        private void RefreshInputs(InstructionInputList inputs, SkillInstruction caller)
        {
            inputs.Inputs.Clear();

            if (caller.Instruction != null)
            {
                caller.Instruction.FindInputs(inputs, VariableLocation.Context);

                while (caller.Inputs.Count < inputs.Inputs.Count)
                {
                    caller.Inputs.Add(VariableValue.CreateEmpty(""));
                }

                if (caller.Inputs.Count > inputs.Inputs.Count)
                {
                    caller.Inputs.RemoveRange(inputs.Inputs.Count, caller.Inputs.Count - inputs.Inputs.Count);
                }

                for (var i = 0; i < inputs.Inputs.Count; i++)
                {
                    var input    = caller.Inputs[i];
                    var variable = inputs.Inputs[i];
                    var type     = GetVariableType(variable.Type);

                    if (input.Name != variable.Variable.Name || input.Type != type)
                    {
                        VariableValue.Destroy(input);
                        caller.Inputs[i] = VariableValue.Create(variable.Variable.Name, type);
                    }
                }
            }
        }
Пример #2
0
        private static void FindInputs(Expression expression, InstructionInputList inputs, VariableLocation location)
        {
            if (expression != null)
            {
                var identifier = expression as IdentifierExpression;
                if (identifier != null)
                {
                    if (identifier.Variable != null && identifier.Variable.Location == location)
                    {
                        inputs.AddPrimitive(identifier.Variable);
                    }

                    return;
                }

                var command = expression as CommandExpression;
                if (command != null)
                {
                    foreach (var parameter in command.Parameters)
                    {
                        FindInputs(parameter, inputs, location);
                    }

                    return;
                }

                var assign = expression as AssignOperator;
                if (assign != null)
                {
                    FindInputs(assign.Right, inputs, location);
                    return;
                }

                var infix = expression as InfixOperatorExpression;
                if (infix != null)
                {
                    FindInputs(infix.Left, inputs, location);
                    FindInputs(infix.Right, inputs, location);
                    return;
                }

                var prefix = expression as PrefixOperatorExpression;
                if (prefix != null)
                {
                    FindInputs(prefix.Right, inputs, location);
                    return;
                }
            }
        }
Пример #3
0
        public void UpdateTriggers()
        {
            Triggers.Clear();

            var inputs = new InstructionInputList();

            Condition.FindInputs(inputs, VariableLocation.Custom);

            foreach (var input in inputs.Inputs)
            {
                if (input.Variable.CustomSource == "Creature")
                {
                    Triggers.Add(input.Variable.Name.Replace("Creature.", ""));
                }
            }
        }
Пример #4
0
 public void FindInputs(InstructionInputList inputs, VariableLocation location)
 {
     FindInputs(_expression, inputs, location);
 }
Пример #5
0
        private static void FindInputs(Instruction instruction, InstructionInputList inputs, List <Instruction> seen, VariableLocation location)
        {
            if (instruction == null || seen.Contains(instruction))
            {
                return;
            }

            seen.Add(instruction);

            var expression = instruction as ExpressionInstruction;

            if (expression != null)
            {
                foreach (var statement in expression.Statements)
                {
                    statement.FindInputs(inputs, location);
                }
            }

            var variableFields        = instruction.GetType().GetFields().Where(field => field.FieldType == typeof(VariableReference));
            var promptFields          = instruction.GetType().GetFields().Where(field => field.FieldType == typeof(PromptString));
            var instructionFields     = instruction.GetType().GetFields().Where(field => typeof(Instruction).IsAssignableFrom(field.FieldType));
            var instructionListFields = instruction.GetType().GetFields().Where(field => field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(List <>) && typeof(Instruction).IsAssignableFrom(field.FieldType.GetGenericArguments()[0]));

            foreach (var field in variableFields)
            {
                var value = field.GetValue(instruction) as VariableReference;

                if (value != null && value.Location == location)
                {
                    inputs.Add(value, field);
                }
            }

            foreach (var field in promptFields)
            {
                var value = field.GetValue(instruction) as PromptString;

                if (value != null)
                {
                    foreach (var input in value.Input)
                    {
                        if (input != null && input.Location == location)
                        {
                            inputs.Add(input, field);
                        }
                    }
                }
            }

            foreach (var field in instructionFields)
            {
                var value = field.GetValue(instruction) as Instruction;
                FindInputs(value, inputs, seen, location);
            }

            foreach (var listField in instructionListFields)
            {
                var instructions = listField.GetValue(instruction) as IList <Instruction>;

                for (var i = 0; i < instructions.Count; i++)
                {
                    var value = instructions[i] as Instruction;
                    FindInputs(value, inputs, seen, location);
                }
            }
        }
Пример #6
0
        public void FindInputs(InstructionInputList inputs, VariableLocation location)
        {
            var seen = new List <Instruction>();

            FindInputs(this, inputs, seen, location);
        }