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); } } } }
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; } } }
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.", "")); } } }
public void FindInputs(InstructionInputList inputs, VariableLocation location) { FindInputs(_expression, inputs, location); }
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); } } }
public void FindInputs(InstructionInputList inputs, VariableLocation location) { var seen = new List <Instruction>(); FindInputs(this, inputs, seen, location); }