Beispiel #1
0
        static private string ProcessNext(Next type, int totalProbability, XmlData.AnimationNode anim, XmlData.NextNode[] nexts)
        {
            string returnString = "";
            var    edgeColor    = sequenceColor;
            var    typeMarker   = "S";

            if (type == Next.Border)
            {
                edgeColor = borderColor; typeMarker = "B";
            }
            if (type == Next.Gravity)
            {
                edgeColor = gravityColor; typeMarker = "G";
            }

            foreach (var next in nexts)
            {
                var relative = (double)next.Probability / totalProbability;
                edgeColor = type == Next.Sequence ? convertProbabilityToGray(relative) : edgeColor;
                var relative2Decimal = relative.ToString("00%");
                var probability      = relative2Decimal == "100%" ? "" : $"({next.Probability})";
                var label            = $"[ label=\"{relative2Decimal}{probability} {next.OnlyFlag} {typeMarker}\" color=\"{edgeColor}\" fontcolor=\"{edgeColor}\" penwidth=\"1\" ]";
                returnString += $"  anim_{anim.Id} -> anim_{next.Value} {label}\r\n";
            }
            return(returnString);
        }
Beispiel #2
0
        static public XmlData.AnimationNode GetXmlAnimationNode(int id)
        {
            XmlData.AnimationNode node = null;
            if (Program.AnimationXML.Animations != null && Program.AnimationXML.Animations.Animation != null)
            {
                foreach (var n in Program.AnimationXML.Animations.Animation)
                {
                    if (n.Id == id)
                    {
                        return(n);
                    }
                }
            }

            return(node);
        }
        private void insertNodeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var cms = contextMenuStrip1;
            var lv  = cms.SourceControl as ListView;

            if (lv == listView1) // spawn
            {
                treeView1.SelectedNode = treeView1.Nodes[0].Nodes[2];
                var node = new XmlData.SpawnNode();
                for (var j = 1; j <= listView1.Items.Count + 2; j++)
                {
                    if (XmlTools.GetXmlSpawnNode(j) == null)
                    {
                        node.Id          = j;
                        node.Next        = new XmlData.NextNode();
                        node.Probability = 10;
                        node.X           = "";
                        node.Y           = "";
                        XmlTools.UpdateXmlSpawnNode(null, node);
                        MainWindow.MainWin.UpdateData();
                        break;
                    }
                }
            }
            else if (lv == listView2) // animations
            {
                treeView1.SelectedNode = treeView1.Nodes[0].Nodes[3];
                var node = new XmlData.AnimationNode();
                for (var j = 1; j <= listView2.Items.Count + 2; j++)
                {
                    if (XmlTools.GetXmlAnimationNode(j) == null)
                    {
                        node.Id   = j;
                        node.Name = "New";
                        XmlTools.UpdateXmlAnimationNode(null, node);
                        MainWindow.MainWin.UpdateData();
                        break;
                    }
                }
            }
            else if (lv == listView3) // childs
            {
                treeView1.SelectedNode = treeView1.Nodes[0].Nodes[4];
                var node = new XmlData.ChildNode();
                for (var j = 1; j <= listView3.Items.Count + 2; j++)
                {
                    if (XmlTools.GetXmlChildNode(j) == null)
                    {
                        node.Id   = j;
                        node.Next = j;
                        XmlTools.UpdateXmlChildNode(null, node);
                        MainWindow.MainWin.UpdateData();
                        break;
                    }
                }
            }
            else if (lv == listView4) // sounds
            {
                treeView1.SelectedNode = treeView1.Nodes[0].Nodes[5];
                var node = new XmlData.SoundNode();
                for (var j = 1; j <= listView4.Items.Count + 2; j++)
                {
                    if (XmlTools.GetXmlSoundNode(j) == null)
                    {
                        node.Id = j;
                        XmlTools.UpdateXmlSoundNode(null, node);
                        MainWindow.MainWin.UpdateData();
                        break;
                    }
                }
            }
        }
Beispiel #4
0
        private async Task <bool> AnalyseAnimations()
        {
            checkBox3.CheckState = CheckState.Indeterminate;
            checkBox3.Tag        = 1;
            var        errors       = 0;
            var        warnings     = 0;
            var        totLinks     = 0;
            List <int> aniId        = new List <int>(32);
            List <int> aniExecution = new List <int>(32);
            List <int> spawnId      = new List <int>(16);

            if (XmlNode.Spawns.Spawn.Length < 1)
            {
                textBox1.Text += "SPAWN ERROR: The animation need at least 1 spawn.\r\n";
                errors++;
            }
            else if (XmlNode.Animations.Animation.Length < 3)
            {
                textBox1.Text += "ANIMATION ERROR: The animation need at least 3 animations.\r\n";
                errors++;
            }
            else
            {
                var fall = false;
                var drag = false;
                var kill = false;
                var sync = false;

                pictureBox1.Width  = XmlClass.spriteWidth;
                pictureBox1.Height = XmlClass.spriteHeight;
                //pictureBox1.Top = Height - tableLayoutPanel1.Top;
                //pictureBox1.Left = Width - tableLayoutPanel1.Left * 2;
                timer1.Tag     = 0;
                timer1.Enabled = true;
                timer1.Start();

                pictureBox2.Image = new Bitmap(XmlClass.bitmapIcon);

                if (pictureBox2.Image.Width != 48 || pictureBox2.Image.Height != 48)
                {
                    textBox1.Text += "ICON ERROR: Size must be 48x48 (not " + pictureBox2.Image.Width + "x" + pictureBox2.Image.Height + ").\r\n";
                    errors++;
                }

                foreach (var s in XmlNode.Spawns.Spawn)
                {
                    if (spawnId.Contains(s.Id))
                    {
                        textBox1.Text += "SPAWN ERROR: The spawn ID " + s.Id + " is present twice.\r\n";
                        errors++;
                    }
                    else
                    {
                        spawnId.Add(s.Id);
                    }
                }

                foreach (var a in XmlNode.Animations.Animation)
                {
                    if (a.Name == "fall")
                    {
                        fall = true;
                    }
                    if (a.Name == "drag")
                    {
                        drag = true;
                    }
                    if (a.Name == "kill")
                    {
                        kill = true;
                    }
                    if (a.Name == "sync")
                    {
                        sync = true;
                    }

                    if (a.Border != null && a.Border.Next != null)
                    {
                        totLinks += a.Border.Next.Length;
                    }
                    if (a.Gravity != null && a.Gravity.Next != null)
                    {
                        totLinks += a.Gravity.Next.Length;
                    }
                    if (a.Sequence != null && a.Sequence.Next != null)
                    {
                        totLinks += a.Sequence.Next.Length;
                    }

                    if (aniId.Contains(a.Id))
                    {
                        textBox1.Text += "ANIMATION ERROR: The animation ID " + a.Id + " is present twice.\r\n";
                        errors++;
                    }
                    else
                    {
                        aniId.Add(a.Id);
                    }
                }
                if (!fall)
                {
                    textBox1.Text += "ANIMATION WARNING: Please add an animation with the name 'fall' for a falling pet.\r\n";
                    warnings++;
                }
                if (!drag)
                {
                    textBox1.Text += "ANIMATION ERROR: Please add an animation with the name 'drag' for a pet that is taken with a mouse.\r\n";
                    errors++;
                }
                if (!kill)
                {
                    textBox1.Text += "ANIMATION ERROR: Please add an animation with the name 'kill' for a pet that will be removed.\r\n";
                    errors++;
                }
                if (!sync)
                {
                    textBox1.Text += "ANIMATION WARNING: Please add an animation with the name 'sync' for syncing the pets.\r\n";
                    warnings++;
                }
            }

            if (errors == 0)
            {
                int    spawns       = 0;
                int    childs       = 0;
                int    animations   = 0;
                int    links        = 0;
                string errorMessage = "";

                try
                {
                    errorMessage = "Loading Xml animations";
                    // check all animations
                    XmlClass.AnimationXML = XmlNode;
                    XmlClass.LoadAnimations(XmlAni);

                    aniExecution.Add(XmlAni.AnimationDrag);
                    aniExecution.Add(XmlAni.AnimationFall);
                    aniExecution.Add(XmlAni.AnimationKill);
                    aniExecution.Add(XmlAni.AnimationSync);

                    // check spawns
                    foreach (var s in XmlNode.Spawns.Spawn)
                    {
                        errorMessage = "spawn " + s.Id;
                        XmlClass.GetXMLCompute(s.X, "spawn x");
                        XmlClass.GetXMLCompute(s.Y, "spawn y");
                        if (!spawnId.Contains(s.Id))
                        {
                            textBox1.Text += "SPAWN ERROR: On spawn " + s.Id + ": animation Id is not available.\r\n";
                            errors++;
                        }
                        if (s.Probability > 0)
                        {
                            aniExecution.Add(s.Next.Value);
                        }
                        spawns++;
                    }

                    // check childs
                    if (XmlNode.Childs.Child != null)
                    {
                        foreach (var c in XmlNode.Childs.Child)
                        {
                            errorMessage = "child " + c.Id;
                            XmlClass.GetXMLCompute(c.X, "spawn x");
                            XmlClass.GetXMLCompute(c.Y, "spawn y");
                            if (!aniId.Contains(c.Id))
                            {
                                textBox1.Text += "CHILD ERROR: On child " + c.Id + ": parent animation Id is not available.\r\n";
                                errors++;
                            }
                            if (!aniId.Contains(c.Next))
                            {
                                textBox1.Text += "CHILD ERROR: On child " + c.Id + ": next animation Id is not available.\r\n";
                                errors++;
                            }
                            childs++;
                        }
                    }

                    // check animations
                    foreach (var a in XmlNode.Animations.Animation)
                    {
                        errorMessage = "animation " + a.Id + " - " + a.Name;
                        XmlClass.GetXMLCompute(a.Start.X, "start x");
                        XmlClass.GetXMLCompute(a.Start.Y, "start y");
                        XmlClass.GetXMLCompute(a.End.X, "end x");
                        XmlClass.GetXMLCompute(a.End.Y, "end y");
                        if (!aniId.Contains(a.Id))
                        {
                            textBox1.Text += "ANIMATION ERROR: On animation " + a.Id + ": animation Id is not available.\r\n";
                            errors++;
                        }
                        if (a.Border != null)
                        {
                            foreach (var an in a.Border.Next)
                            {
                                if (!aniId.Contains(an.Value))
                                {
                                    textBox1.Text += "ANIMATION ERROR: On animation " + a.Id + ": border Next Id " + an.Value + " is not available.\r\n";
                                    errors++;
                                }
                            }
                        }
                        if (a.Gravity != null)
                        {
                            foreach (var an in a.Gravity.Next)
                            {
                                if (!aniId.Contains(an.Value))
                                {
                                    textBox1.Text += "ANIMATION ERROR: On animation " + a.Id + ": gravity Next Id " + an.Value + " is not available.\r\n";
                                    errors++;
                                }
                            }
                        }
                        if (a.Sequence != null)
                        {
                            if (a.Sequence.Next == null)
                            {
                                if (a.Name != "kill")
                                {
                                    textBox1.Text += "ANIMATION WARNING: On animation " + a.Id + ": this sequence does not have a next node, pet will respawn after this sequence.\r\n";
                                    warnings++;
                                }
                            }
                            else
                            {
                                foreach (var an in a.Sequence.Next)
                                {
                                    if (!aniId.Contains(an.Value))
                                    {
                                        textBox1.Text += "ANIMATION ERROR: On animation " + a.Id + ": sequence Next Id " + an.Value + " is not available.\r\n";
                                        errors++;
                                    }
                                }
                            }
                        }

                        animations++;
                    }

                    // check links
                    for (var k = 0; k < 100; k++)
                    {
                        List <int> aniAdds = new List <int>();
                        foreach (var aId in aniExecution)
                        {
                            errorMessage = "check links, pass " + k + " id " + aId;
                            XmlData.AnimationNode ani = null;
                            foreach (var xa in XmlNode.Animations.Animation)
                            {
                                if (xa.Id == aId)
                                {
                                    ani = xa;
                                    break;
                                }
                            }
                            if (ani == null)
                            {
                                continue;
                            }

                            if (ani.Gravity != null)
                            {
                                foreach (var an in ani.Gravity.Next)
                                {
                                    if (!aniExecution.Contains(an.Value) && !aniAdds.Contains(an.Value))
                                    {
                                        aniAdds.Add(an.Value);
                                    }
                                }
                            }
                            if (ani.Border != null)
                            {
                                foreach (var an in ani.Border.Next)
                                {
                                    if (!aniExecution.Contains(an.Value) && !aniAdds.Contains(an.Value))
                                    {
                                        aniAdds.Add(an.Value);
                                    }
                                }
                            }
                            if (ani.Sequence != null && ani.Sequence.Next != null)
                            {
                                foreach (var an in ani.Sequence.Next)
                                {
                                    if (!aniExecution.Contains(an.Value) && !aniAdds.Contains(an.Value))
                                    {
                                        aniAdds.Add(an.Value);
                                    }
                                }
                            }
                        }

                        aniExecution.AddRange(aniAdds);

                        if (aniExecution.Count == aniId.Count)
                        {
                            break;
                        }
                    }

                    if (aniExecution.Count != aniId.Count)
                    {
                        foreach (var ai in aniId)
                        {
                            if (!aniExecution.Contains(ai))
                            {
                                textBox1.Text += "ANIMATION WARNING: On animation " + ai + ": This ID is never played.\r\n";
                                warnings++;
                            }
                        }
                    }

                    await UpdateAnimationsState(spawns, XmlNode.Spawns.Spawn.Length,
                                                animations, XmlNode.Animations.Animation.Length,
                                                childs, XmlNode.Childs != null && XmlNode.Childs.Child != null?XmlNode.Childs.Child.Length : 0,
                                                links, totLinks);
                }
                catch (Exception ex)
                {
                    textBox1.Text += "ERROR: " + errorMessage + "\r\n" + ex.Message;
                }
            }

            checkBox3.CheckState = CheckState.Checked;
            checkBox3.Tag        = 2;
            //label4.Text = "COMPLETED";

            textBox1.Text += "Errors: " + errors + ", Warnings: " + warnings + "\r\n";

            if (errors == 0)
            {
            }

            return(errors == 0);
        }
Beispiel #5
0
        static public AnimationStatistics GetAnimationStatistics(XmlData.AnimationNode node, StatisticsDataInput dimensions, Control c)
        {
            var  stat           = new AnimationStatistics();
            bool variableRand   = false;
            bool variableScreen = false;

            stat.Frames = node.Sequence.Frame.Length;
            if (node.Sequence.RepeatCount.IndexOf("screen") >= 0 || node.Sequence.RepeatCount.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.Sequence.RepeatCount.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.Repeats     = EvalValue(node.Sequence.RepeatCount, dimensions, c);
            stat.RepeatFrom  = node.Sequence.RepeatFromFrame;
            stat.TotalFrames = stat.Frames + (stat.Frames - stat.RepeatFrom) * stat.Repeats;

            stat.Start = new AnimationStatistics.StepValues();
            if (node.Start.X.IndexOf("screen") >= 0 || node.Start.X.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.Start.X.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.Start.X = EvalValue(node.Start.X, dimensions, c);
            if (node.Start.Y.IndexOf("screen") >= 0 || node.Start.Y.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.Start.Y.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.Start.Y = EvalValue(node.Start.Y, dimensions, c);
            if (node.Start.Interval.IndexOf("screen") >= 0 || node.Start.Interval.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.Start.Interval.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.Start.Interval = EvalValue(node.Start.Interval, dimensions, c);
            stat.Start.Offset   = node.Start.OffsetY;
            stat.Start.Opacity  = node.Start.Opacity;

            stat.End = new AnimationStatistics.StepValues();
            if (node.End.X.IndexOf("screen") >= 0 || node.End.X.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.End.X.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.End.X = EvalValue(node.End.X, dimensions, c);
            if (node.End.Y.IndexOf("screen") >= 0 || node.End.Y.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.End.Y.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.End.Y = EvalValue(node.End.Y, dimensions, c);
            if (node.End.Interval.IndexOf("screen") >= 0 || node.End.Interval.IndexOf("area") >= 0)
            {
                variableScreen = true;
            }
            if (node.End.Interval.IndexOf("random") >= 0)
            {
                variableRand = true;
            }
            stat.End.Interval = EvalValue(node.End.Interval, dimensions, c);
            stat.End.Offset   = node.End.OffsetY;
            stat.End.Opacity  = node.End.Opacity;

            stat.SubSteps = new List <AnimationStatistics.StepValues>();
            for (var k = 0; k < stat.TotalFrames; k++)
            {
                var step = new AnimationStatistics.StepValues();
                step.X        = (int)(stat.Start.X + (stat.End.X - stat.Start.X) * ((double)k / stat.TotalFrames));
                step.Y        = (int)(stat.Start.Y + (stat.End.Y - stat.Start.Y) * ((double)k / stat.TotalFrames));
                step.Interval = (int)(stat.Start.Interval + (stat.End.Interval - stat.Start.Interval) * ((double)k / stat.TotalFrames));
                step.Opacity  = (int)(stat.Start.Opacity + (stat.End.Opacity - stat.Start.Opacity) * ((double)k / stat.TotalFrames));
                step.Offset   = (int)(stat.Start.Offset + (stat.End.Offset - stat.Start.Offset) * ((double)k / stat.TotalFrames));
                stat.SubSteps.Add(step);
            }

            stat.RandomVariable = variableRand;
            stat.ScreenVariable = variableScreen;
            stat.TotalTime      = 0;
            stat.TotalX         = 0;
            stat.TotalY         = 0;
            foreach (var s in stat.SubSteps)
            {
                stat.TotalTime += s.Interval;
                stat.TotalX    += s.X;
                stat.TotalY    += s.Y;
            }

            return(stat);
        }
Beispiel #6
0
 static public bool ProofAnimation(XmlData.AnimationNode original, XmlData.AnimationNode current)
 {
     if (original.Id != current.Id) // proof if nothing is linking to the original Id
     {
         foreach (var s in Program.AnimationXML.Spawns.Spawn)
         {
             if (s.Next.Value == original.Id)
             {
                 Program.AddLog("Spawn " + s.Id + " is using this ID", "Change Animation ID", Program.LOG_TYPE.WARNING, null);
             }
         }
         foreach (var a in Program.AnimationXML.Animations.Animation)
         {
             foreach (var a2 in a.Sequence.Next)
             {
                 if (a2.Value == original.Id)
                 {
                     Program.AddLog("Animation " + a.Id + " is using this ID as next", "Change Animation ID", Program.LOG_TYPE.WARNING, null);
                 }
             }
             if (a.Gravity != null)
             {
                 foreach (var a2 in a.Gravity.Next)
                 {
                     if (a2.Value == original.Id)
                     {
                         Program.AddLog("Animation " + a.Id + " is using this ID as gravity", "Change Animation ID", Program.LOG_TYPE.WARNING, null);
                     }
                 }
             }
             if (a.Border != null)
             {
                 foreach (var a2 in a.Border.Next)
                 {
                     if (a2.Value == original.Id)
                     {
                         Program.AddLog("Animation " + a.Id + " is using this ID as border", "Change Animation ID", Program.LOG_TYPE.WARNING, null);
                     }
                 }
             }
         }
         if (Program.AnimationXML.Childs != null)
         {
             foreach (var c in Program.AnimationXML.Childs.Child)
             {
                 if (c.Next == original.Id)
                 {
                     Program.AddLog("Child " + c.Id + " is using this ID", "Change Animation ID", Program.LOG_TYPE.WARNING, null);
                 }
             }
         }
         if (Program.AnimationXML.Sounds != null)
         {
             foreach (var s in Program.AnimationXML.Sounds.Sound)
             {
                 if (s.Id == original.Id)
                 {
                     Program.AddLog("Sound " + s.Id + " is using this ID", "Change Animation ID", Program.LOG_TYPE.WARNING, null);
                 }
             }
         }
     }
     return(true);
 }
Beispiel #7
0
 static public void UpdateXmlAnimationNode(XmlData.AnimationNode oldNode, XmlData.AnimationNode newNode)
 {
     if (Program.AnimationXML.Animations == null || Program.AnimationXML.Animations.Animation == null || oldNode == null)
     {
         var newNodes = new XmlData.AnimationNode[1];
         if (newNode.Start == null)
         {
             newNode.Start          = new XmlData.MovingNode();
             newNode.Start.X        = "0";
             newNode.Start.Y        = "0";
             newNode.Start.Interval = "100";
             newNode.Start.OffsetY  = 0;
             newNode.Start.Opacity  = 1.0;
         }
         if (newNode.End == null)
         {
             newNode.End          = new XmlData.MovingNode();
             newNode.End.X        = "0";
             newNode.End.Y        = "0";
             newNode.End.Interval = "100";
             newNode.End.OffsetY  = 0;
             newNode.End.Opacity  = 1.0;
         }
         if (newNode.Sequence == null)
         {
             newNode.Sequence                 = new XmlData.SequenceNode();
             newNode.Sequence.RepeatCount     = "0";
             newNode.Sequence.RepeatFromFrame = 0;
         }
         if (newNode.Sequence.Frame == null)
         {
             newNode.Sequence.Frame = new int[0];
         }
         newNodes[0] = newNode;
         if (Program.AnimationXML.Animations == null)
         {
             Program.AnimationXML.Animations = new XmlData.AnimationsNode();
         }
         if (Program.AnimationXML.Animations.Animation == null)
         {
             Program.AnimationXML.Animations.Animation = new XmlData.AnimationNode[0];
         }
         Program.AnimationXML.Animations.Animation = Program.AnimationXML.Animations.Animation.Concat(newNodes).ToArray();
     }
     else
     {
         for (var k = 0; k < Program.AnimationXML.Animations.Animation.Length; k++)
         {
             if (Program.AnimationXML.Animations.Animation[k].Id == oldNode.Id)
             {
                 if (newNode == null)
                 {
                     var newAnis = new List <XmlData.AnimationNode>(Program.AnimationXML.Animations.Animation);
                     newAnis.RemoveAt(k);
                     Program.AnimationXML.Animations.Animation = newAnis.ToArray();
                 }
                 else
                 {
                     Program.AnimationXML.Animations.Animation[k] = newNode;
                 }
                 break;
             }
         }
     }
 }