/**
  * Event: On highlight quest
  */
 public void OnHighlight(QuestManager.Quest quest)
 {
     foreach(OnHighlightDelegate callback in highlightCallbacks)
     {
         callback(quest);
     }
 }
        /**
         * Event: Begin quest
         */
        public void OnBeginQuest(QuestManager.Quest quest)
        {
            this.SetImage(quest.image.Value);
            this.SetHeading("Quest started");
            this.SetBody(quest.title);

            if(this.GetComponent<Interpolator>() != null)
            {
                this.GetComponent<Interpolator>().SetAllDelays(this.delay);
                this.GetComponent<Interpolator>().Play(true);
            }
        }
        /**
         * Event: Progress objective
         */
        public void OnProgresssObjective(QuestManager.Objective objective)
        {
            QuestManager.Quest quest = objective.GetQuest();

            this.SetImage(quest.image.Value);
            this.SetHeading(quest.title);
            this.SetBody(objective.title + "(" + objective.progress + "/" + objective.goal + ")");

            if(this.GetComponent<Interpolator>() != null)
            {
                this.GetComponent<Interpolator>().SetAllDelays(this.delay);
                this.GetComponent<Interpolator>().Play(true);
            }
        }
        /**
         * Event: On highlight
         */
        public void OnHighlight(QuestManager.Quest quest)
        {
            if(this.title != null)
            {
                this.title.text = quest.title;
            }

            if(this.description != null)
            {
                this.description.text = quest.description;
            }

            if(this.image != null)
            {
                this.image.sprite = quest.image.Value;
            }
        }
        public void OnProgress(QuestManager.Objective objective = null)
        {
            QuestManager.Quest quest = QuestManager.GetCurrentQuest();
            QuestManager.Objective obj = quest.GetCurrentObjective();
            UIText label = this.GetComponent<UIText>();

            if(obj != null && label != null)
            {
                string output = pattern;

                output = output.Replace("{{quest_title}}", quest.title);
                output = output.Replace("{{objective_title}}", obj.title);
                output = output.Replace("{{objective_progress}}", obj.progress.ToString());
                output = output.Replace("{{objective_goal}}", obj.goal.ToString());

                label.text = output;
            }
        }
        /**
         * Creates a list item
         */
        private void CreateListItem(QuestManager.Quest quest)
        {
            int index = this.transform.childCount - 1;

            // Init
            Button listItem = Instantiate(this.listItemTemplate);
            listItem.gameObject.SetActive(true);
            listItem.name = quest.title;

            // Text
            Text label = listItem.GetComponentInChildren<Text>();
            label.text = quest.title;

            // Position
            listItem.transform.SetParent(this.transform);
            listItem.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, index * this.listItemTemplate.GetComponent<RectTransform>().rect.height);
            listItem.GetComponent<RectTransform>().sizeDelta = listItemTemplate.GetComponent<RectTransform>().sizeDelta;

            // Event
            listItem.onClick.AddListener(() => {
                OnHighlight(quest);
            });
        }
        /**
         * Gets an instance of this manager
         */
        public static QuestManager GetInstance()
        {
            if(instance == null)
            {
                instance = ManagerBase.GetManagerInstance<QuestManager>();
            }

            return instance;
        }