private static ModelsPath GetResult(IContext context, string path, IRandom random) { var parts = GetParts(path); var models = new List <IModel>(); var result = new ModelsPath(); IModel current = null; for (int i = 0; i < parts.Count; i++) { current = current == null?context.GetChild(parts[i][0]) : current.GetChild(parts[i][0]); if (SelectPathUtil.IsSimple(parts[i][1])) { models.Add(current); current = current.GetChild(parts[i][1]); models.Add(current); } else { var allKeys = new List <string>(); allKeys.AddRange(((IReferenceCollection)current).dataSource.GetNode().GetSortedKeys()); var affectedKeys = SelectPathUtil.GetAffectedKeys(parts[i][1], allKeys); var availableModels = new List <IReferenceModel>(); foreach (var key in affectedKeys) { var testModel = (IReferenceModel)current.GetChild(key); if (testModel.selectable && testModel.CheckAvailable()) { availableModels.Add(testModel); } } if (affectedKeys.Count == 0) { return(null); } models.Add(current); current = availableModels[random.Range(0, availableModels.Count)]; models.Add(current); } } result.Set(models, false); return(result); }
public Reward(RawNode node, IContext context) : base(node, context) { type = node.GetString("type"); if (node.CheckKey("choice")) { choice = FactoryManager.Build <PathChoice>(node.GetNode("choice"), context); } else { if (node.CheckKey("path")) { path = PathUtil.GetModelPath(GetContext(), node.GetNode("path")); } } }
public ModelsPath GetPath() { return(_cache ?? (_cache = PathUtil.GetModelPath(GetContext(), node.GetString("path"), null))); }