コード例 #1
0
        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);
        }
コード例 #2
0
        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"));
                }
            }
        }
コード例 #3
0
 public ModelsPath GetPath()
 {
     return(_cache ?? (_cache = PathUtil.GetModelPath(GetContext(), node.GetString("path"), null)));
 }