private string ParseDialogueElement(JsonTextReader reader)
        {
            string id = null, optionText = null;
            bool   entrypoint = false;
            DialoguePrecondition  pre = null;
            ICollection <string>  options = null, body = null;
            DialoguePostcondition post = null;

            while (reader.Read())
            {
                Spit(reader);
                if (reader.TokenType == JsonToken.PropertyName)
                {
                    string propertyValue = reader.Value.ToString().ToLower();
                    reader.Read();
                    Spit(reader);

                    switch (propertyValue)
                    {
                    case "id":
                        if (reader.TokenType == JsonToken.String)
                        {
                            id = (string)reader.Value;
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element id: " + reader.TokenType);
                        }
                        break;

                    case "option_text":
                        if (reader.TokenType == JsonToken.String)
                        {
                            optionText = (string)reader.Value;
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element option text: " + reader.TokenType);
                        }
                        break;

                    case "entrypoint":
                        if (reader.TokenType == JsonToken.Boolean)
                        {
                            entrypoint = (bool)reader.Value;
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element option text: " + reader.TokenType);
                        }
                        break;

                    case "pre":
                        if (reader.TokenType == JsonToken.StartObject)
                        {
                            pre = ParsePrecondition(reader);
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element precondition: " + reader.TokenType);
                        }
                        break;

                    case "body":
                        if (reader.TokenType == JsonToken.StartArray)
                        {
                            List <string> bodyElements = new List <string>();
                            reader.Read();
                            Spit(reader);
                            while (reader.TokenType != JsonToken.EndArray)
                            {
                                if (reader.TokenType == JsonToken.String)
                                {
                                    bodyElements.Add((string)reader.Value);
                                }
                                else
                                {
                                    throw new JsonReaderException("Unexpected element when parsing dialogue element body: " + reader.TokenType);
                                }
                                reader.Read();
                                Spit(reader);
                            }
                            body = bodyElements.ToArray();
                        }
                        else if (reader.TokenType == JsonToken.String)
                        {
                            body = new string[] { (string)reader.Value };
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element body: " + reader.TokenType);
                        }
                        break;

                    case "options":
                        if (reader.TokenType == JsonToken.StartArray)
                        {
                            options = ParseOptions(reader);
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element options: " + reader.TokenType);
                        }
                        break;

                    case "post":
                        if (reader.TokenType == JsonToken.StartObject)
                        {
                            post = ParsePostcondition(reader);
                        }
                        else
                        {
                            throw new JsonReaderException("Unexpected element when parsing dialogue element postcondition: " + JsonToken.PropertyName);
                        }
                        break;

                    default:
                        throw new JsonReaderException("Unexpected property name when parsing dialogue element: " + propertyValue);
                    }
                }
                else if (reader.TokenType == JsonToken.EndObject)
                {
                    if (null == id)
                    {
                        throw new JsonReaderException("No id found when parsing dialogue element");
                    }
                    if (null == body)
                    {
                        throw new JsonReaderException("No body elements found for dialogue element " + id);
                    }
                    dialogueElements.Add(
                        id,
                        new UnresolvedDialogueElement(
                            id,
                            entrypoint,
                            optionText,
                            pre,
                            body.ToArray(),
                            options == null ? null : options.ToArray(),
                            post));
                    return(id);
                }
                else
                {
                    throw new JsonReaderException("Unexpected element when parsing dialogue element: " + reader.TokenType);
                }
            }
            throw new JsonReaderException("Unexpected EOF when parsing dialogue element");
        }
 public UnresolvedDialogueElement(string id, bool entrypoint, string optionText, DialoguePrecondition pre, string[] body, string[] unresolvedOptions, DialoguePostcondition post)
 {
     this.id                = id;
     this.entrypoint        = entrypoint;
     this.optionText        = optionText;
     this.pre               = pre;
     this.body              = body;
     this.unresolvedOptions = unresolvedOptions;
     this.post              = post;
 }