public override WorldDescriptionRecord GetWorldDescriptionRecord()
        {
            string errorString;
            string expressionEffect = "";

            if (ParseAction(ComboBoxAction.SelectedIndex, out errorString) &&
                ParseExpression(TextBoxFormEffect.Text, out expressionEffect, out errorString))
            {
                //allow empty ifExpresion
                string expressionIf = "";
                ParseExpression(TextBoxFormIf.Text, out expressionIf, out errorString);

                var wdr = new ActionCausesIfRecord(this.SelectedAction, expressionEffect, expressionIf);
                CleanValues();
                return(wdr);
            }

            LabelValidation.Content = errorString;
            throw new TypeLoadException("Validation error");
        }
        private IEnumerable <State> GetPossibleFutureStates(WorldAction worldAction, State state, int time)
        {
            var possibleFutureStates = new List <State>();

            // Get released fluents
            var releasedFluents = GetReleasedFluents(worldAction, state, time);

            // Get possible state changes from ActionCausesIf records
            var actionCausesRec = Descriptions.Where(t => t.Item1 == WorldDescriptionRecordType.ActionCausesIf)
                                  .Select(t => t.Item2 as ActionCausesIfRecord).ToList();
            ActionCausesIfRecord causedStatesX = null;

            try
            {
                causedStatesX = actionCausesRec.Where(t => t.IsFulfilled(state, worldAction)).Aggregate((x, y) => x.Concat(y));
            }
            catch (InvalidOperationException)
            {
                return(new List <State>()
                {
                    state
                });
            }
            var causedStates         = causedStatesX.GetResult();
            var possibleStateChanges = new List <State>(causedStates.Select(t => new State {
                Fluents = t.ToList()
            }));

            // Get all future states excluding released fluents changes
            foreach (var stateChange in possibleStateChanges)
            {
                var template = (State)state.Clone();
                template.Fluents.RemoveAll(t => stateChange.Fluents.Any(x => x.Name == t.Name));
                template.Fluents.AddRange(stateChange.Fluents);
                possibleFutureStates.Add(template);
            }

            // Include released fluents
            foreach (var fluent in releasedFluents)
            {
                var statesToAdd = new List <State>();
                foreach (var futureState in possibleFutureStates)
                {
                    var copy            = (State)futureState.Clone();
                    var fluentToRelease = copy.Fluents.First(t => t.Name == fluent.Name);
                    fluentToRelease.Value = !fluentToRelease.Value;
                    statesToAdd.Add(copy);
                }
                possibleFutureStates.AddRange(statesToAdd);
            }

            if (possibleFutureStates.Count == 0)
            {
                possibleFutureStates = new List <State>()
                {
                    state
                };
            }

            return(possibleFutureStates);
        }