Exemplo n.º 1
0
        /// <summary>
        /// 向栈机提交一个函数调用
        /// </summary>
        /// <param name="sf">被调用函数的SceneFuction实例</param>
        /// <param name="args">实参数列表</param>
        /// <param name="offset">PC偏移量</param>
        public void Submit(SceneFunction sf, List <object> args, int offset = 0)
        {
            // 处理形参顺序
            string argc = sf.Param.Aggregate(String.Empty, (current, arg) => current + ("," + arg));

            if (argc.Length > 0)
            {
                argc = argc.Substring(1);
            }
            StackMachineFrame smf = new StackMachineFrame()
            {
                State               = StackMachineState.FunctionCalling,
                ScriptName          = sf.Callname,
                PC                  = offset,
                IP                  = sf.Ctor,
                IR                  = sf.Ctor.NodeName,
                BindingFunction     = sf,
                Argv                = args,
                BindingFunctionName = String.Format("{0}?{1}", sf.GlobalName, this.coreStack.Count.ToString()),
                BindingSceneName    = sf.ParentSceneName,
                Delay               = TimeSpan.FromMilliseconds(0),
                Tag                 = argc
            };

            this.coreStack.Push(smf);
            this.EBP = this.coreStack.Peek();
        }
Exemplo n.º 2
0
        /// <summary>
        /// 向栈机提交一个自动播放等待
        /// </summary>
        /// <param name="autoWaitPending">自动播放延时</param>
        public void Submit(TimeSpan autoWaitPending)
        {
            StackMachineFrame smf = new StackMachineFrame()
            {
                State               = StackMachineState.AutoWait,
                ScriptName          = null,
                PC                  = 0,
                IP                  = null,
                IR                  = String.Empty,
                Argv                = null,
                BindingFunctionName = null,
                BindingSceneName    = null,
                Delay               = autoWaitPending,
                Tag                 = null
            };

            this.coreStack.Push(smf);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 向栈机提交一个等待动画完成的调用
        /// </summary>
        /// <param name="causeBy">原因</param>
        public void Submit(string causeBy)
        {
            StackMachineFrame smf = new StackMachineFrame()
            {
                State               = StackMachineState.WaitAnimation,
                ScriptName          = null,
                PC                  = 0,
                IP                  = null,
                IR                  = String.Empty,
                Argv                = null,
                BindingFunctionName = null,
                BindingSceneName    = null,
                Delay               = TimeSpan.FromMilliseconds(0),
                Tag                 = String.Format("WaitingAnimationFor:{0}", causeBy)
            };

            this.coreStack.Push(smf);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 向栈机提交一个场景调用
        /// </summary>
        /// <param name="sc">被调用的场景Scene实例</param>
        /// <param name="offset">IP偏移</param>
        public void Submit(Scene sc, SceneAction offset = null)
        {
            StackMachineFrame smf = new StackMachineFrame()
            {
                State               = StackMachineState.Interpreting,
                ScriptName          = sc.Scenario,
                PC                  = 0,
                IP                  = offset ?? sc.Ctor,
                IR                  = sc.Ctor?.NodeName,
                Argv                = null,
                BindingSceneName    = sc.Scenario,
                BindingFunctionName = null,
                Delay               = TimeSpan.FromMilliseconds(0),
                Tag                 = String.Empty
            };

            this.coreStack.Push(smf);
            this.EBP = this.SAVEP = this.coreStack.Peek();
        }
Exemplo n.º 5
0
        /// <summary>
        /// 向栈机提交一个延时调用
        /// </summary>
        /// <param name="causeBy">发起延时的SA名</param>
        /// <param name="begin">开始计时的时刻</param>
        /// <param name="sleepTimeSpan">延时时间间隔</param>
        public void Submit(string causeBy, DateTime begin, TimeSpan sleepTimeSpan)
        {
            StackMachineFrame smf = new StackMachineFrame()
            {
                State               = StackMachineState.Await,
                ScriptName          = null,
                PC                  = 0,
                IP                  = null,
                IR                  = String.Empty,
                Argv                = null,
                BindingFunctionName = null,
                BindingSceneName    = null,
                TimeStamp           = begin,
                Delay               = sleepTimeSpan,
                Tag                 = String.Format("ThreadSleepCausedBy:{0}({1} ms)", causeBy, sleepTimeSpan.Milliseconds)
            };

            this.coreStack.Push(smf);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 向栈机提交一个中断调用
        /// </summary>
        /// <param name="ntr">中断</param>
        public void Submit(Interrupt ntr)
        {
            StackMachineFrame smf = new StackMachineFrame()
            {
                State               = StackMachineState.Interrupt,
                ScriptName          = null,
                PC                  = 0,
                IP                  = ntr.InterruptSA,
                IR                  = ntr.InterruptSA?.NodeName,
                Argv                = null,
                BindingFunctionName = null,
                BindingSceneName    = null,
                Delay               = TimeSpan.FromMilliseconds(0),
                Tag                 = ntr.ReturnTarget,
                BindingInterrupt    = ntr
            };

            this.coreStack.Push(smf);
        }
Exemplo n.º 7
0
 /// <summary>
 /// 向栈机提交一个栈帧
 /// </summary>
 /// <param name="mySMF">自定义栈帧</param>
 public void Submit(StackMachineFrame mySMF)
 {
     this.coreStack.Push(mySMF);
 }