public InfiniteLoopManager(Enemy enemy, LoopIndex index, EnemyActionBehaviourData data)
 {
     _Enemy            = enemy;
     _CompleteObserver = new Subject <Unit> ();
     _Index            = index;
     _Data             = data;
     _Manager          = new RepeatManager(enemy, index, data);
     _OnComplete();
 }
Esempio n. 2
0
        /// <summary>
        /// 解析分页列表标签. 调用此方法解析后,模板里将会对“PageListTag”变量赋值,结构如下:
        /// PageListTag = new { PageNumber = 当前页号, PageSize = 页码, PageCount = 总页码数量, RecordCount = 总记录数量, StartIndex = 当前页号内数据的起始位置, EndIndex = 当前页号内数据的结束位置 }
        /// 。并且还会在模板里注册一个“CreatePageListUrl”方法,用于获取分页列表地址。此方法可在变量标签里直接call调用,如:{$n call="CreatePageListUrl"},将输出n表示的页号地址,
        /// 其中n必须为数字值或者“first”、“首页”、“previous”、“上页”、“next”、“下页”、“last”、“尾页”这几个特殊值。
        /// </summary>
        /// <param name="template">分页列表标签所在的模板</param>
        /// <param name="pageNumber">当前页号</param>
        /// <param name="pageSize">页码</param>
        /// <param name="recordCount">数量总数</param>
        /// <param name="pageListUrlCreator">生成分页列表地址的委托函数</param>
        public static void ParsePageListTag(Template template, int pageNumber, int pageSize, int recordCount, Func <int, string> pageListUrlCreator)
        {
            int pageCount  = pageSize > 0 ? (int)Math.Ceiling((double)recordCount / pageSize) : recordCount;
            int startIndex = (pageNumber - 1) * pageSize + 1;
            int endIndex   = pageNumber * pageSize;

            endIndex = endIndex > recordCount ? recordCount : endIndex;
            if (startIndex > endIndex)
            {
                startIndex = endIndex;
            }
            template.Variables.SetValue("PageListTag", new { PageNumber = pageNumber, PageSize = pageSize, PageCount = pageCount, RecordCount = recordCount, StartIndex = startIndex, EndIndex = endIndex });
            if (pageListUrlCreator != null)
            {
                //注册两个用于获取分页地址的变量方法
                template.RegisterGlobalFunction("CreatePageListUrl", (o =>
                {
                    if (o[0] is LoopIndex)
                    {
                        LoopIndex li = (LoopIndex)o[0];
                        if (li != null)
                        {
                            return(pageListUrlCreator(li.ToInt32(null)));
                        }
                        else
                        {
                            return(pageListUrlCreator(o[0].As <int>()));
                        }
                    }
                    else
                    {
                        switch (o[0].ToString(""))
                        {
                        case "first":
                        case "首页":
                            return(pageListUrlCreator(1));

                        case "previous":
                        case "上页":
                            return(pageListUrlCreator(pageNumber > 1 ? pageNumber - 1 : 1));

                        case "next":
                        case "下页":
                            return(pageListUrlCreator(pageNumber < pageCount ? pageNumber + 1 : pageCount));

                        case "last":
                        case "尾页":
                            return(pageListUrlCreator(pageCount));

                        default:
                            return(pageListUrlCreator(o[0].As <int>(1)));
                        }
                    }
                }));
            }
        }
            public RepeatManager(Enemy enemy, LoopIndex loopData, EnemyActionBehaviourData originData)
            {
                _CompleteObserver = new Subject <Unit> ();
                var container = new List <IProcesser> ();

                _SetUp(enemy, loopData, originData, container, 0);
                _Processers = container.GetEnumerator();
                _Processers.MoveNext();
                _OnComplete();
            }
            private void _PutOutError(Enemy enemy, LoopIndex index, EnemyActionBehaviourData data)
            {
                EnemyActionDataWithLoop putData = null;

                for (int i = 0; i < data.EnemyActionData.Count(); i++)
                {
                    putData = data.EnemyActionData.ElementAt(i);
                    if (putData.LoopIndex == index)
                    {
                        Debug.LogError(string.Format("無限ループに陥っていますデータを見直してください :  ObjectName → {0} : DataName → {1} : Index → {2}", enemy.name, putData.ActionData.name, i));
                        return;
                    }
                }
            }
 public string AsCsvString() =>
 LoopIndex.ToString()
 .ConcatCsv(MonitoringScheme.AsString())
 .ConcatCsv(VectorLength.ToString())
 .ConcatCsv(NumOfNodes.ToString())
 .ConcatCsv(Approximation.AsString())
 .ConcatCsv(Communication.Bandwidth.ToString())
 .ConcatCsv(Communication.UdpBandwidth.ToString())
 .ConcatCsv(Communication.Messages.ToString())
 .ConcatCsv(Communication.UdpMessages.ToString())
 .ConcatCsv(Communication.Latency.ToString())
 .ConcatCsv(NumberOfFullSyncs.ToString())
 .ConcatCsv(LowerBound.AsCsvString())
 .ConcatCsv(FunctionValue.ToString(CultureInfo.InvariantCulture))
 .ConcatCsv(UpperBound.AsCsvString())
 .ConcatCsv(NodesFunctionValues.Aggregate("", (csv, value) => csv.ConcatCsv(value.ToString(CultureInfo.InvariantCulture))));
            private void _SetUp(Enemy enemy, LoopIndex dataIndex, EnemyActionBehaviourData originData, List <IProcesser> container, int loopCount)
            {
                if (loopCount > 1000)
                {
                    _PutOutError(enemy, dataIndex, originData);
                    return;
                }
                for (int i = 0; i < dataIndex.LoopCount; i++)
                {
                    loopCount++;
                    if (loopCount > 1000)
                    {
                        _PutOutError(enemy, dataIndex, originData);
                        break;
                    }
                    var data = originData.EnemyActionData.Skip((int)dataIndex.LoopStartIndex)
                               .Take(1 + (int)(dataIndex.LoopEndIndex - dataIndex.LoopStartIndex));

                    container.Add(new EnemyActionProcesser(enemy, data.First().ActionData));

                    for (int y = 1; y < data.Count(); y++)
                    {
                        loopCount++;
                        if (loopCount > 1000)
                        {
                            _PutOutError(enemy, dataIndex, originData);
                            break;
                        }

                        var loopData = data.ElementAt(y);

                        container.Add(new EnemyActionProcesser(enemy, loopData.ActionData));
                        if (loopData.LoopIndex.LoopCount != 0)
                        {
                            _SetUp(enemy, loopData.LoopIndex, originData, container, loopCount);
                            continue;
                        }
                    }
                }
            }