private void LoadEmotionsFromXMLNode(XmlNode parentNode, ref Dictionary<string, Emot_Emotion> emotionDict)
    {
        foreach (XmlNode xmlEmotion in parentNode.ChildNodes)
        {
            var emotion = new Emot_Emotion(xmlEmotion.Attributes["Name"].Value);
            var xmlAnimMappings = xmlEmotion.ChildNodes;

            foreach (XmlNode xmlAnimMapping in xmlAnimMappings)
                emotion.AnimMappings.Add(xmlAnimMapping.Attributes["Name"].Value, float.Parse(xmlAnimMapping.Attributes["Value"].Value));

            emotionDict.Add(emotion.Name, emotion);
        }
    }
    public void NormalisePersonality(string emotionToPreserveName)
    {
        if (!Emotions.ContainsKey(emotionToPreserveName)) return;

        Emot_Emotion emotionToScale = null;
        List<Emot_Emotion> allOtherEmotions = new List<Emot_Emotion>();

        foreach (var emotion in Emotions)
        {
            if (emotion.Key == emotionToPreserveName)
                emotionToScale = emotion.Value;
            else
                allOtherEmotions.Add(emotion.Value);
        }

        // Find amount to change.
        float targetRemainder = 1f - emotionToScale.PersonalityValue;
        float remainder = 0f;
        foreach (var emotion in allOtherEmotions)
            remainder += emotion.PersonalityValue;
        float delta = targetRemainder - remainder;

        // Scale values.
        foreach (var emotion in allOtherEmotions)
        {
            if (targetRemainder <= float.Epsilon)
                emotion.PersonalityValue = 0f;
            else
            {
                float ratio = 0f;
                if (remainder <= float.Epsilon)
                    ratio = 1f / allOtherEmotions.Count;
                else
                    ratio = emotion.PersonalityValue / remainder;

                emotion.PersonalityValue += delta * ratio;
            }            
        }
    }