示例#1
0
 /// <summary>
 /// After an animation is over and after a new animation was selected, this function will play the selected animation.
 /// </summary>
 /// <param name="id">Animation ID to play.</param>
 private void SetNewAnimation(int id)
 {
     if (id < 0)  // no animation found, spawn!
     {
         Play(false);
     }
     else
     {
         iAnimationStep   = -1;
         CurrentAnimation = Animations.GetAnimation(id);
         // Check if animation ID has a child. If so, the child will be created.
         if (Animations.HasAnimationChild(id))
         {
             if (Name != "child")
             {
                 TChild childInfo = Animations.GetAnimationChild(id);
                 Form2  child     = new Form2(Animations, Xml, new Point(Left, Top), !bMoveLeft);
                 for (int i = 0; i < imageList1.Images.Count - 1; i++)
                 {
                     child.addImage(imageList1.Images[i]);
                 }
                 // To detect if it is a child, the name of the form will be renamed.
                 child.Name = "child";
                 child.Show(Width, Height);
                 child.PlayChild(id);
             }
         }
         timer1.Interval = CurrentAnimation.Start.Interval.GetValue();
     }
 }
示例#2
0
        /// <summary>
        /// Update the values of the animation.<br />
        /// If "random" was used, on each start of a new animation this will change so the expression must be evaluated again.<br />
        /// Total steps are also calculated, so it has a better performance by playing it.
        /// </summary>
        /// <param name="id">ID of the Animation.</param>
        private void UpdateAnimationValues(int id)
        {
            bool       bUpdated = false;
            TAnimation ani      = SheepAnimations[id];

            if (ani.Sequence.Repeat.IsDynamic)
            {
                // Calculate the total steps, based on the repeat values.
                ani.Sequence.TotalSteps = ani.Sequence.CalculateTotalSteps();
                bUpdated = true;
            }
            if (ani.Start.Interval.IsDynamic || ani.Start.X.IsDynamic || ani.Start.Y.IsDynamic)
            {
                ani.Start.Interval.Value = ani.Start.Interval.GetValue();
                ani.Start.X.Value        = ani.Start.X.GetValue();
                ani.Start.Y.Value        = ani.Start.Y.GetValue();
                bUpdated = true;
            }
            if (ani.End.Interval.IsDynamic || ani.End.X.IsDynamic || ani.End.Y.IsDynamic)
            {
                ani.End.Interval.Value = ani.End.Interval.GetValue();
                ani.End.X.Value        = ani.End.X.GetValue();
                ani.End.Y.Value        = ani.End.Y.GetValue();
                bUpdated = true;
            }

            // If a value was changed, overwrite the old structure with the new one.
            if (bUpdated)
            {
                SheepAnimations[id] = ani;
            }

            StartUp.AddDebugInfo(StartUp.DEBUG_TYPE.info, "new animation: " + ani.Name + " (" + ani.ID + ")");
        }
示例#3
0
 /// <summary>
 /// Get the structure of the animation.
 /// </summary>
 /// <param name="id">ID of the wanted animation.</param>
 /// <returns>Structure with all information about this animation.</returns>
 public TAnimation GetAnimation(int id)
 {
     if (!SheepAnimations.ContainsKey(id))
     {
         TAnimation tempAnimation = new TAnimation("NULL", 0);
         tempAnimation.Start.Interval.Value = 1000;
         tempAnimation.End.Interval.Value   = 1000;
     }
     return(SheepAnimations[id]);
 }
示例#4
0
 /// <summary>
 /// After an animation is over and after a new animation was selected, this function will play the selected animation.
 /// </summary>
 /// <param name="id">Animation ID to play.</param>
 private void SetNewAnimation(int id)
 {
     if (CurrentAnimation.ID == Animations.AnimationKill)
     {
         return;
     }
     if (id < 0)  // no animation found, spawn!
     {
         Play(false);
     }
     else
     {
         iAnimationStep   = -1;
         CurrentAnimation = Animations.GetAnimation(id);
         // Check if animation ID has a child. If so, the child will be created.
         if (Animations.HasAnimationChild(id))
         {
             // child creating childs... Maximum 5 sub-childs can be created
             if (Name.IndexOf("child") < 0 || int.Parse(Name.Substring(5)) < 5)
             {
                 TChild childInfo = Animations.GetAnimationChild(id);
                 Form2  child     = new Form2(Animations, Xml, new Point(Left, Top), !bMoveLeft);
                 for (int i = 0; i < imageList1.Images.Count; i++)
                 {
                     child.addImage(imageList1.Images[i]);
                 }
                 // To detect if it is a child, the name of the form will be renamed.
                 if (Name.IndexOf("child") < 0) // first child
                 {
                     child.Name = "child1";
                 }
                 else if (Name.IndexOf("child") == 0) // second, fifth child
                 {
                     child.Name = "child" + (int.Parse(Name.Substring(5)) + 1).ToString();
                 }
                 child.Show(Width, Height);
                 child.PlayChild(id);
             }
         }
         timer1.Interval = CurrentAnimation.Start.Interval.GetValue();
     }
 }
示例#5
0
        /// <summary>
        /// Load the animations (read them from XML file)
        /// </summary>
        /// <param name="animations">Animation class where the animations should be saved</param>
        public void LoadAnimations(Animations animations)
        {
            if (AnimationXML.Animations == null)
            {
                StartUp.AddDebugInfo(StartUp.DEBUG_TYPE.error, "No animations for this pet");
                return;
            }
            // for each animation
            foreach (XmlData.AnimationNode node in AnimationXML.Animations.Animation)
            {
                TAnimation ani = animations.AddAnimation(node.Id, node.Id.ToString());
                ani.Border  = node.Border != null;
                ani.Gravity = node.Gravity != null;

                ani.Name = node.Name;
                switch (ani.Name)
                {
                case "fall": animations.AnimationFall = node.Id; break;

                case "drag": animations.AnimationDrag = node.Id; break;

                case "kill": animations.AnimationKill = node.Id; break;

                case "sync": animations.AnimationSync = node.Id; break;
                }

                ani.Start.X        = GetXMLCompute(node.Start.X, "animation " + node.Id + ": node.start.X");
                ani.Start.Y        = GetXMLCompute(node.Start.Y, "animation " + node.Id + ": node.start.Y");
                ani.Start.Interval = GetXMLCompute(node.Start.Interval, "animation " + node.Id + ": node.start.Interval");
                ani.Start.OffsetY  = node.Start.OffsetY;
                ani.Start.Opacity  = node.Start.Opacity;

                ani.End.X        = GetXMLCompute(node.End.X, "animation " + node.Id + ": node.end.X");
                ani.End.Y        = GetXMLCompute(node.End.Y, "animation " + node.Id + ": node.end.Y");
                ani.End.Interval = GetXMLCompute(node.End.Interval, "animation " + node.Id + ": node.end.Interval");
                ani.End.OffsetY  = node.End.OffsetY;
                ani.End.Opacity  = node.End.Opacity;

                ani.Sequence.RepeatFrom = node.Sequence.RepeatFromFrame;
                ani.Sequence.Action     = node.Sequence.Action;
                ani.Sequence.Repeat     = GetXMLCompute(node.Sequence.RepeatCount, "animation " + node.Id + ": node.sequence.Repeat");
                ani.Sequence.Frames.AddRange(node.Sequence.Frame);
                if (ani.Sequence.RepeatFrom > 0)
                {
                    ani.Sequence.TotalSteps = ani.Sequence.Frames.Count + (ani.Sequence.Frames.Count - ani.Sequence.RepeatFrom - 1) * ani.Sequence.Repeat.Value;
                }
                else
                {
                    ani.Sequence.TotalSteps = ani.Sequence.Frames.Count + ani.Sequence.Frames.Count * ani.Sequence.Repeat.Value;
                }
                if (node.Sequence.Next != null)
                {
                    foreach (XmlData.NextNode nextNode in node.Sequence.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }

                        ani.EndAnimation.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                if (ani.Border)
                {
                    foreach (XmlData.NextNode nextNode in node.Border.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }
                        ani.Border = true;
                        ani.EndBorder.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                if (ani.Gravity)
                {
                    foreach (XmlData.NextNode nextNode in node.Gravity.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }
                        ani.Gravity = true;
                        ani.EndGravity.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                animations.SaveAnimation(ani, node.Id);
            }

            // for each spawn
            if (AnimationXML.Spawns.Spawn != null)
            {
                foreach (XmlData.SpawnNode node in AnimationXML.Spawns.Spawn)
                {
                    TSpawn ani = animations.AddSpawn(
                        node.Id,
                        node.Probability);

                    ani.Start.X = GetXMLCompute(node.X, "spawn " + node.Id + ": node.X");
                    ani.Start.Y = GetXMLCompute(node.Y, "spawn " + node.Id + ": node.X");
                    ani.Next    = node.Next.Value;

                    animations.SaveSpawn(ani, node.Id);
                }
            }

            // for each child
            if (AnimationXML.Childs.Child != null)
            {
                foreach (XmlData.ChildNode node in AnimationXML.Childs.Child)
                {
                    TChild aniChild = animations.AddChild(node.Id);
                    aniChild.AnimationID = node.Id;

                    aniChild.Position.X = GetXMLCompute(node.X, "child " + node.Id + ": node.X");
                    aniChild.Position.Y = GetXMLCompute(node.Y, "child " + node.Id + ": node.Y");
                    aniChild.Next       = node.Next;

                    animations.SaveChild(aniChild, node.Id);
                }
            }

            // for each sound
            if (AnimationXML.Sounds != null && AnimationXML.Sounds.Sound != null)
            {
                foreach (XmlData.SoundNode node in AnimationXML.Sounds.Sound)
                {
                    animations.AddSound(node.Id, node.Probability, node.Loop, node.Base64);
                }
            }
        }
示例#6
0
 /// <summary>
 /// After adding the animation and filling data, this function must be called to save values.
 /// </summary>
 /// <param name="animation">Structure of an animation.</param>
 /// <param name="ID">ID of the animation to save in.</param>
 public void SaveAnimation(TAnimation animation, int ID)
 {
     SheepAnimations[ID] = animation;
 }
示例#7
0
        /// <summary>
        /// Load the animations (read them from XML file)
        /// </summary>
        /// <param name="animations">Animation class where the animations should be saved</param>
        public void loadAnimations(Animations animations)
        {
            // for each animation
            foreach (AnimationNode node in AnimationXML.Animations.Animation)
            {
                TAnimation ani = animations.AddAnimation(node.Id, node.Id.ToString());
                ani.Border  = node.Border != null;
                ani.Gravity = node.Gravity != null;

                ani.Name = node.Name;
                switch (ani.Name)
                {
                case "fall": animations.AnimationFall = node.Id; break;

                case "drag": animations.AnimationDrag = node.Id; break;

                case "kill": animations.AnimationKill = node.Id; break;

                case "sync": animations.AnimationSync = node.Id; break;
                }

                ani.Start.X        = getXMLCompute(node.Start.X);
                ani.Start.Y        = getXMLCompute(node.Start.Y);
                ani.Start.Interval = getXMLCompute(node.Start.Interval);
                ani.Start.OffsetY  = node.Start.OffsetY;
                ani.Start.Opacity  = node.Start.Opacity;

                ani.End.X        = getXMLCompute(node.End.X);
                ani.End.Y        = getXMLCompute(node.End.Y);
                ani.End.Interval = getXMLCompute(node.End.Interval);
                ani.End.OffsetY  = node.End.OffsetY;
                ani.End.Opacity  = node.End.Opacity;

                ani.Sequence.RepeatFrom = node.Sequence.RepeatFromFrame;
                ani.Sequence.Action     = node.Sequence.Action;
                ani.Sequence.Repeat     = getXMLCompute(node.Sequence.RepeatCount);
                foreach (int frameid in node.Sequence.Frame)
                {
                    ani.Sequence.Frames.Add(frameid);
                }
                if (ani.Sequence.RepeatFrom > 0)
                {
                    ani.Sequence.TotalSteps = ani.Sequence.Frames.Count + (ani.Sequence.Frames.Count - ani.Sequence.RepeatFrom - 1) * ani.Sequence.Repeat.Value;
                }
                else
                {
                    ani.Sequence.TotalSteps = ani.Sequence.Frames.Count + ani.Sequence.Frames.Count * ani.Sequence.Repeat.Value;
                }
                if (node.Sequence.Next != null)
                {
                    foreach (NextNode nextNode in node.Sequence.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }

                        ani.EndAnimation.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                if (ani.Border)
                {
                    foreach (NextNode nextNode in node.Border.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }
                        ani.Border = true;
                        ani.EndBorder.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                if (ani.Gravity)
                {
                    foreach (NextNode nextNode in node.Gravity.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }
                        ani.Gravity = true;
                        ani.EndGravity.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                animations.SaveAnimation(ani, node.Id);
            }

            // for each spawn
            if (AnimationXML.Spawns.Spawn != null)
            {
                foreach (SpawnNode node in AnimationXML.Spawns.Spawn)
                {
                    TSpawn ani = animations.AddSpawn(
                        node.Id,
                        node.Probability);

                    ani.Start.X = getXMLCompute(node.X);
                    ani.Start.Y = getXMLCompute(node.Y);
                    ani.Next    = node.Next.Value;

                    animations.SaveSpawn(ani, node.Id);
                }
            }

            // for each child
            if (AnimationXML.Childs.Child != null)
            {
                foreach (ChildNode node in AnimationXML.Childs.Child)
                {
                    TChild aniChild = animations.AddChild(node.Id);
                    aniChild.AnimationID = node.Id;

                    aniChild.Position.X = getXMLCompute(node.X);
                    aniChild.Position.Y = getXMLCompute(node.Y);
                    aniChild.Next       = node.Next;

                    animations.SaveChild(aniChild, node.Id);
                }
            }

            // for each sound
            if (AnimationXML.Sounds != null && AnimationXML.Sounds.Sound != null)
            {
                foreach (SoundNode node in AnimationXML.Sounds.Sound)
                {
                    animations.AddSound(node.Id, node.Probability, node.Loop, node.Base64);
                }
            }
        }
示例#8
0
        /// <summary>
        /// Load the animations (read them from XML file)
        /// </summary>
        /// <param name="animations">Animation class where the animations should be saved</param>
        public void loadAnimations(Animations animations)
        {
            // for each animation
            foreach (AnimationNode node in AnimationXML.Animations.Animation)
            {
                TAnimation ani = animations.AddAnimation(node.Id, node.Id.ToString());
                ani.Border  = node.Border != null;
                ani.Gravity = node.Gravity != null;

                ani.Name = node.Name;
                switch (ani.Name)
                {
                case "fall": animations.AnimationFall = node.Id; break;

                case "drag": animations.AnimationDrag = node.Id; break;

                case "kill": animations.AnimationKill = node.Id; break;

                case "sync": animations.AnimationSync = node.Id; break;
                }

                ani.Start.X        = getXMLCompute(node.Start.X);
                ani.Start.Y        = getXMLCompute(node.Start.Y);
                ani.Start.Interval = getXMLCompute(node.Start.Interval);
                ani.Start.OffsetY  = node.Start.OffsetY;
                ani.Start.Opacity  = node.Start.Opacity;

                ani.End.X        = getXMLCompute(node.End.X);
                ani.End.Y        = getXMLCompute(node.End.Y);
                ani.End.Interval = getXMLCompute(node.End.Interval);
                ani.End.OffsetY  = node.End.OffsetY;
                ani.End.Opacity  = node.End.Opacity;

                ani.Sequence.RepeatFrom = node.Sequence.RepeatFromFrame;
                ani.Sequence.Action     = node.Sequence.Action;
                ani.Sequence.Repeat     = getXMLCompute(node.Sequence.RepeatCount);
                foreach (int frameid in node.Sequence.Frame)
                {
                    ani.Sequence.Frames.Add(frameid);
                }
                if (ani.Sequence.RepeatFrom > 0)
                {
                    ani.Sequence.TotalSteps = ani.Sequence.Frames.Count + (ani.Sequence.Frames.Count - ani.Sequence.RepeatFrom - 1) * ani.Sequence.Repeat.Value;
                }
                else
                {
                    ani.Sequence.TotalSteps = ani.Sequence.Frames.Count + ani.Sequence.Frames.Count * ani.Sequence.Repeat.Value;
                }
                if (node.Sequence.Next != null)
                {
                    foreach (NextNode nextNode in node.Sequence.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }

                        ani.EndAnimation.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                if (ani.Border)
                {
                    foreach (NextNode nextNode in node.Border.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }
                        ani.Border = true;
                        ani.EndBorder.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                if (ani.Gravity)
                {
                    foreach (NextNode nextNode in node.Gravity.Next)
                    {
                        TNextAnimation.TOnly where;
                        switch (nextNode.OnlyFlag)
                        {
                        case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;

                        case "window": where = TNextAnimation.TOnly.WINDOW; break;

                        case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;

                        case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;

                        case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;

                        default: where = TNextAnimation.TOnly.NONE; break;
                        }
                        ani.Gravity = true;
                        ani.EndGravity.Add(
                            new TNextAnimation(
                                nextNode.Value,
                                nextNode.Probability,
                                where
                                )
                            );
                    }
                }

                /* OLD XML parsing:
                 *
                 *  foreach (XmlNode node3 in node2.SelectNodes(".//pet:next", xmlNS))
                 *  {
                 *      TNextAnimation.TOnly where = TNextAnimation.TOnly.NONE;
                 *      if (node3.Attributes["only"] != null)
                 *      {
                 *          switch (node3.Attributes["only"].InnerText)
                 *          {
                 *              case "taskbar": where = TNextAnimation.TOnly.TASKBAR; break;
                 *              case "window": where = TNextAnimation.TOnly.WINDOW; break;
                 *              case "horizontal": where = TNextAnimation.TOnly.HORIZONTAL; break;
                 *              case "horizontal+": where = TNextAnimation.TOnly.HORIZONTAL_; break;
                 *              case "vertical": where = TNextAnimation.TOnly.VERTICAL; break;
                 *          }
                 *      }
                 *      ani.Gravity = true;
                 *      ani.EndGravity.Add(
                 *          new TNextAnimation(
                 *              int.Parse(node3.InnerText, CultureInfo.InvariantCulture),
                 *              int.Parse(node3.Attributes["probability"].InnerText, CultureInfo.InvariantCulture),
                 *              where
                 *          )
                 *      );
                 *  }
                 *  break;
                 */
                animations.SaveAnimation(ani, node.Id);
            }

            // for each spawn
            if (AnimationXML.Spawns.Spawn != null)
            {
                foreach (SpawnNode node in AnimationXML.Spawns.Spawn)
                {
                    TSpawn ani = animations.AddSpawn(
                        node.Id,
                        node.Probability);

                    ani.Start.X = getXMLCompute(node.X);
                    ani.Start.Y = getXMLCompute(node.Y);
                    ani.Next    = node.Next.Value;

                    animations.SaveSpawn(ani, node.Id);
                }
            }

            // for each child
            if (AnimationXML.Childs.Child != null)
            {
                foreach (ChildNode node in AnimationXML.Childs.Child)
                {
                    TChild aniChild = animations.AddChild(node.Id);
                    aniChild.AnimationID = node.Id;

                    aniChild.Position.X = getXMLCompute(node.X);
                    aniChild.Position.Y = getXMLCompute(node.Y);
                    aniChild.Next       = node.Next;

                    animations.SaveChild(aniChild, node.Id);
                }
            }
        }