Пример #1
0
        public static string Render(Game game, ActionResult result)
        {
            string body = "";

            if (game == null || game.CurrentAR == null || game.CurrentAR.Storylet == null)
                return "No storylet!";

            body += "<div class='storylet'>";

            body += string.Format("<h3>{0}</h3>\n", game.CurrentAR.Storylet.Title);

            foreach(var test in game.CurrentAR.Tests)
            {
                if (test != null && test.Test != null)
                {
                    var qual = Data.GetQuality(test.Test.QualityName);
                    if (qual != null)
                        body += string.Format("<p>You {0} a test of {1} {2}</p>\n", (test.Success) ? "succeeded" : "failed", qual.Title, test.Test.Value);
                }
            }

            body += CommonMarkConverter.Convert(game.CurrentAR.Storylet.Body);

            body += "</div>";

            if (result != null)
            {
                foreach(var inv in result.InventoryOps)
                {
                    body += RenderInventoryOp(inv);
                }
            }

            List<KeyValuePair<string, Storylet.Link>> specialLinks = new List<KeyValuePair<string, Storylet.Link>>();

            foreach (var kvp in game.CurrentAR.Options)
            {
                if (string.IsNullOrEmpty(kvp.Value.Special))
                {
                    body += RenderLink(kvp.Value, kvp.Key, game.Items);
                }
                else
                {
                    specialLinks.Add(kvp);
                }
            }

            foreach (var link in game.CurrentAR.NonOptions)
            {
                body += RenderLink(link, null, game.Items);
            }

            foreach (var kvp in specialLinks)
            {
                body += RenderLink(kvp.Value, kvp.Key, game.Items);
            }

            return body;
        }
Пример #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;
        }
Пример #3
0
        public bool TakeAction(string action)
        {
            if (CurrentAR == null)
            {
                Data.Log("Cannot take action {0}, no AR", action);
                return false;
            }

            Data.Log("Taking action {0}", action);
            if (CurrentAR.Options.ContainsKey(action))
            {
                var storylet = Data.GetStorylet(CurrentAR.Options[action].StoryletName);
                Data.Log("Storylet: {0} {1}", CurrentAR.Options[action].StoryletName, (storylet != null) ? "found" : "not found");
                if (storylet == null)
                    return false;

                ActionResult r = new ActionResult();
                GoToStorylet(storylet, r);
                CurrentAR = r;
                SetupAR();
                return true;
            }

            return false;
        }
Пример #4
0
        public bool JumpToStorylet(Storylet s)
        {
            if (s == null)
            {
                Data.Log("Cannot jump to null storylet");
                return false;
            }

            Data.Log("Jumping to storylet {0}", s.Name);
            ActionResult r = new ActionResult();
            GoToStorylet(s, r);
            CurrentAR = r;
            SetupAR();

            return true;
        }