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; }
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; }
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; }
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; }