Ejemplo n.º 1
0
            public bool FromLine(string line, NodeType type)
            {
                var chunks = line.Split(' ');
                int idx = 0;

                StoryletName = chunks[idx].Remove(0, 1);

                while (++idx < chunks.Length)
                {
                    if (chunks[idx] == "Success")
                    {
                        Test = TestResult.Success;
                    }
                    else if (chunks[idx] == "Failure")
                    {
                        Test = TestResult.Failure;
                    }
                    else
                    {
                        int w;
                        if (int.TryParse(chunks[idx], out w))
                        {
                            Weight = w;
                        }
                    }
                }

                if (type == NodeType.Test && Test == TestResult.None)
                    return false;

                return true;
            }
Ejemplo n.º 2
0
        public void GoToStorylet(Storylet s, ActionResult r)
        {
            if (s == null)
                return;

            Data.Log("GoTo Storylet {0}", s.Name);

            foreach (var op in s.Operations)
            {
                var opRes = op.ApplyOp(Items);
                r.InventoryOps.Add(opRes);
            }

            if (s.IsLocation)
            {
                CurrentLocation = s;
                r.CountsAsLocation = true;
            }

            if (s.MoveLoc != null)
            {
                var storylet = Data.GetStorylet(s.MoveLoc);
                if (storylet != null && storylet.IsLocation)
                {
                    CurrentLocation = storylet;
                }
            }

            if (s.Type == Storylet.NodeType.PassThrough)
            {
                foreach(var link in s.Links)
                {
                    var storylet = Data.GetStorylet(link.StoryletName);
                    if (storylet != null && storylet.HasMet(Items))
                    {
                        GoToStorylet(storylet, r);
                        return;
                    }
                }

                return;
            }

            if (s.Type == Storylet.NodeType.Chance)
            {
                Data.Log("Chance!");

                int total = 0;
                var metStorylets = new List<Storylet>();
                var metLinks = new List<Storylet.Link>();
                foreach(var link in s.Links)
                {
                    var storylet = Data.GetStorylet(link.StoryletName);
                    if (storylet != null && storylet.HasMet(Items))
                    {
                        Data.Log("Add chance for {0} {1}", storylet.Name, link.Weight);

                        total += link.Weight;
                        metStorylets.Add(storylet);
                        metLinks.Add(link);
                    }
                }

                int roll = Data.GenericRandom.Next(total);
                Data.Log("Rolled {0} on total {1}", roll, total);
                for (int i = 0; i < metStorylets.Count; i++)
                {
                    roll -= metLinks[i].Weight;
                    if (roll < 0)
                    {
                        GoToStorylet(metStorylets[i], r);
                        return;
                    }
                }

                return;
            }

            if (s.Type == Storylet.NodeType.Test)
            {
                int roll;
                foreach(var test in s.Tests)
                {
                    bool success = true;
                    int odds = 100 - test.GetOdds(Items);
                    roll = Data.GenericRandom.Next(100);
                    if (roll < odds)
                        success = false;

                    TestResult tr = new TestResult();
                    tr.Test = test;
                    tr.Success = success;
                    r.Tests.Add(tr);
                }

                int total = 0;
                var metStorylets = new List<Storylet>();
                var metLinks = new List<Storylet.Link>();
                foreach(var link in s.Links)
                {
                    if (r.TestSuccess && link.Test != Storylet.Link.TestResult.Success)
                        continue;

                    if (!r.TestSuccess && link.Test != Storylet.Link.TestResult.Failure)
                        continue;

                    var storylet = Data.GetStorylet(link.StoryletName);
                    if (storylet != null && storylet.HasMet(Items))
                    {
                        total += link.Weight;
                        metStorylets.Add(storylet);
                        metLinks.Add(link);
                    }
                }

                roll = Data.GenericRandom.Next(total);
                for (int i = 0; i < metStorylets.Count; i++)
                {
                    roll -= metLinks[i].Weight;
                    if (roll < 0)
                    {
                        GoToStorylet(metStorylets[i], r);
                        return;
                    }
                }

                return;
            }

            r.Storylet = s;
        }