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