private void BuildInputArgs(BoxedValueList args) { string[] strVals = null; int[] boolVals = null; float[] floatVals = null; int[] dropdownVals = null; if (null != InputLabels) { int strCt = InputLabels.Count; strVals = new string[strCt]; for (int i = 0; i < strCt; ++i) { strVals[i] = InputLabels[i].text; } if (strCt > 0) { args.Add(BoxedValue.From(strVals)); } } if (null != InputToggles) { int boolCt = InputToggles.Count; boolVals = new int[boolCt]; for (int i = 0; i < boolCt; ++i) { boolVals[i] = InputToggles[i].isOn ? 1 : 0; } if (boolCt > 0) { args.Add(BoxedValue.From(boolVals)); } } if (null != InputSliders) { int floatCt = InputSliders.Count; floatVals = new float[floatCt]; for (int i = 0; i < floatCt; ++i) { floatVals[i] = InputSliders[i].value; } if (floatCt > 0) { args.Add(BoxedValue.From(floatVals)); } } if (null != InputDropdowns) { int dropdownCt = InputDropdowns.Count; dropdownVals = new int[dropdownCt]; for (int i = 0; i < dropdownCt; ++i) { dropdownVals[i] = InputDropdowns[i].value; } if (dropdownCt > 0) { args.Add(BoxedValue.From(dropdownVals)); } } }
internal void OnClickHandler(string tag) { BoxedValueList args = GfxStorySystem.Instance.NewBoxedValueList(); args.Add(tag); BuildInputArgs(args); GfxStorySystem.Instance.SendMessage(string.Format("{0}:on_click", WindowName), args); }
internal void OnToggleHandler(string tag, bool val) { BoxedValueList args = GfxStorySystem.Instance.NewBoxedValueList(); args.Add(tag); args.Add(val ? 1 : 0); BuildInputArgs(args); GfxStorySystem.Instance.SendMessage(string.Format("{0}:on_toggle", WindowName), args); }
internal void OnSliderHandler(string tag, float val) { BoxedValueList args = GfxStorySystem.Instance.NewBoxedValueList(); args.Add(tag); args.Add(val); BuildInputArgs(args); GfxStorySystem.Instance.SendMessage(string.Format("{0}:on_slider", WindowName), args); }
internal void SendMessage(string msgId, BoxedValueList args) { int ct = m_StoryLogicInfos.Count; for (int ix = ct - 1; ix >= 0; --ix) { StoryInstance info = m_StoryLogicInfos[ix]; info.SendMessage(msgId, args); } }
public void SendConcurrentMessage(string msgId, BoxedValueList args) { int ct = m_StoryLogicInfos.Count; for (int ix = ct - 1; ix >= 0; --ix) { StoryInstance info = m_StoryLogicInfos[ix]; var newArgs = info.NewBoxedValueList(); newArgs.AddRange(args); info.SendConcurrentMessage(msgId, newArgs); } m_BoxedValueListPool.Recycle(args); }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_HaveValue = false; m_X.Evaluate(instance, handler, iterator, args); TryUpdateValue(); }
internal void PostCall(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { PopStack(instance, handler); }
internal void PreCall(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { //command的执行不像函数,它支持类似协程的机制,允许暂时挂起,稍后继续,这意味着并非每次调用ExecCommand都对应语义上的一次过程调用 //,因此栈的创建不能在ExecCommand里进行(事实上,在ExecCommand里无法区分本次执行是一次新的过程调用还是一次挂起后的继续执行)。 var stackInfo = StoryLocalInfo.New(); //调用实参部分需要在栈建立之前运算,结果需要记录在栈上 for (int i = 0; i < m_LoadedArgs.Count; ++i) { stackInfo.Args.Add(m_LoadedArgs[i].Clone()); } foreach (var pair in m_LoadedOptArgs) { stackInfo.OptArgs.Add(pair.Key, pair.Value.Clone()); } for (int i = 0; i < stackInfo.Args.Count; i++) { stackInfo.Args[i].Evaluate(instance, handler, iterator, args); } foreach (var pair in stackInfo.OptArgs) { pair.Value.Evaluate(instance, handler, iterator, args); } //实参处理完,进入函数体执行,创建新的栈 PushStack(instance, handler, stackInfo); }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_Cmd.PostCall(instance, handler, iterator, args); }
protected override bool ExecCommand(StoryInstance instance, StoryMessageHandler handler, long delta, BoxedValue iterator, BoxedValueList args) { var runtime = handler.PeekRuntime(); if (runtime.TryBreakLoop()) { return(false); } var localInfos = handler.LocalInfoStack.Peek(); var localInfo = localInfos.GetLocalInfo(m_LocalInfoIndex) as LocalInfo; if (null == localInfo) { localInfo = new LocalInfo { List = new List <IStoryValue>() }; for (int i = 0; i < m_LoadedIterators.Count; ++i) { localInfo.List.Add(m_LoadedIterators[i].Clone()); } localInfos.SetLocalInfo(m_LocalInfoIndex, localInfo); } if (!handler.PeekRuntime().CompositeReentry) { Evaluate(instance, handler, iterator, args); } bool ret = true; while (ret) { if (localInfo.Iterators.Count > 0) { Prepare(handler); runtime = handler.PeekRuntime(); runtime.Iterator = BoxedValue.From(localInfo.Iterators.Dequeue()); runtime.Arguments = args; ret = true; //没有wait之类命令直接执行 runtime.Tick(instance, handler, delta); if (runtime.CommandQueue.Count == 0) { handler.PopRuntime(instance); if (runtime.TryBreakLoop()) { ret = false; break; } } else { //遇到wait命令,跳出执行,之后直接在StoryMessageHandler里执行栈顶的命令队列(降低开销) break; } } else { ret = false; } } return(ret); }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_HaveValue = false; if (m_ParamNum > 0) { m_Var.Evaluate(instance, handler, iterator, args); } TryUpdateValue(); }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { if (null != m_Proxy) { m_Proxy.Evaluate(instance, handler, iterator, args); } }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { string name = m_VariableName; if (!string.IsNullOrEmpty(name)) { m_HaveValue = instance.TryGetVariable(name, out m_Value); } else { m_Value.SetNullObject(); m_HaveValue = true; } }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { if (m_ParamNum > 1) { m_ObjId.Evaluate(instance, handler, iterator, args); } m_LeaderId.Evaluate(instance, handler, iterator, args); }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { if (m_HaveUserId) { m_UserId.Evaluate(instance, handler, iterator, args); } for (int i = 0; i < m_UnitIds.Count; i++) { m_UnitIds[i].Evaluate(instance, handler, iterator, args); } }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { var stackInfo = StoryLocalInfo.New(); var runtime = StoryRuntime.New(); //调用实参部分需要在栈建立之前运算,结果需要记录在栈上 for (int i = 0; i < m_LoadedArgs.Count; ++i) { stackInfo.Args.Add(m_LoadedArgs[i].Clone()); } foreach (var pair in m_LoadedOptArgs) { stackInfo.OptArgs.Add(pair.Key, pair.Value.Clone()); } runtime.Arguments = instance.NewBoxedValueList(); runtime.Arguments.Capacity = stackInfo.Args.Count; for (int i = 0; i < stackInfo.Args.Count; i++) { stackInfo.Args[i].Evaluate(instance, handler, iterator, args); runtime.Arguments.Add(stackInfo.Args[i].Value); } runtime.Iterator = stackInfo.Args.Count; foreach (var pair in stackInfo.OptArgs) { pair.Value.Evaluate(instance, handler, iterator, args); } //实参处理完,进入函数体执行,创建新的栈 PushStack(instance, handler, stackInfo, runtime); try { for (int i = 0; i < m_ArgNames.Count; ++i) { if (i < stackInfo.Args.Count) { instance.SetVariable(m_ArgNames[i], stackInfo.Args[i].Value); } else { instance.SetVariable(m_ArgNames[i], BoxedValue.NullObject); } } foreach (var pair in stackInfo.OptArgs) { instance.SetVariable(pair.Key, pair.Value.Value); } Prepare(runtime); stackInfo.HaveValue = true; runtime.Tick(instance, handler, long.MaxValue); BoxedValue val; instance.TryGetVariable(m_ReturnName, out val); stackInfo.Value = val; } finally { instance.RecycleBoxedValueList(runtime.Arguments); PopStack(instance, handler); } }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_HaveValue = false; m_X.Evaluate(instance, handler, iterator, args); if (m_X.HaveValue) { int x = m_X.Value.Get <int>(); if (x == 0) { m_HaveValue = true; m_Value = 0; } else { m_Y.Evaluate(instance, handler, iterator, args); if (m_Y.HaveValue) { int y = m_Y.Value.Get <int>(); m_HaveValue = true; m_Value = (y != 0 ? 1 : 0); } } } }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_Receiver.Evaluate(instance, handler, iterator, args); m_Title.Evaluate(instance, handler, iterator, args); m_Content.Evaluate(instance, handler, iterator, args); m_Sender.Evaluate(instance, handler, iterator, args); m_LevelDemand.Evaluate(instance, handler, iterator, args); m_ValidPeriod.Evaluate(instance, handler, iterator, args); m_Money.Evaluate(instance, handler, iterator, args); m_Gold.Evaluate(instance, handler, iterator, args); for (int i = 0; i < m_MailItems.Count; ++i) { IStoryValue <int> val = m_MailItems[i]; val.Evaluate(instance, handler, iterator, args); } }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { if (m_HaveUserId) { m_UserId.Evaluate(instance, handler, iterator, args); } m_StoryDlgId.Evaluate(instance, handler, iterator, args); }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_HaveValue = false; for (int i = 0; i < m_Args.Count; i++) { m_Args[i].Evaluate(instance, handler, iterator, args); } TryUpdateValue(); }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_Pos.Evaluate(instance, handler, iterator, args); m_Radius.Evaluate(instance, handler, iterator, args); m_Type.Evaluate(instance, handler, iterator, args); m_EventName.Evaluate(instance, handler, iterator, args); if (m_HaveSet) { m_SetVar.Evaluate(instance, handler, iterator, args); m_SetVal.Evaluate(instance, handler, iterator, args); m_ElseSetVal.Evaluate(instance, handler, iterator, args); } }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { if (m_ArgIndex >= 0 && m_ArgIndex < args.Count) { m_Value = args[m_ArgIndex]; m_HaveValue = true; } else if (m_ArgIndex == c_Iterator) { m_Value = iterator; m_HaveValue = true; } else { m_Value.SetNullObject(); m_HaveValue = true; } }
public void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_HaveValue = false; m_Object.Evaluate(instance, handler, iterator, args); m_Method.Evaluate(instance, handler, iterator, args); bool canCalc = true; if (!m_Object.HaveValue || !m_Method.HaveValue) { canCalc = false; } if (canCalc) { m_HaveValue = true; var obj = m_Object.Value; string method = m_Method.Value; if (obj.IsObject && !string.IsNullOrEmpty(method)) { object v = 0; IEnumerable list = obj.ObjectVal as IEnumerable; if (null != list) { if (method == "orderby" || method == "orderbydesc") { bool desc = method == "orderbydesc"; ObjList results = new ObjList(); IEnumerator enumer = list.GetEnumerator(); while (enumer.MoveNext()) { object val = enumer.Current; results.Add(val); } results.Sort((object o1, object o2) => { BoxedValue r1 = BoxedValue.NullObject; for (int i = 0; i < m_Args.Count; i++) { m_Args[i].Evaluate(instance, handler, BoxedValue.From(o1), args); r1 = m_Args[i].Value; } BoxedValue r2 = BoxedValue.NullObject; for (int i = 0; i < m_Args.Count; i++) { m_Args[i].Evaluate(instance, handler, BoxedValue.From(o2), args); r2 = m_Args[i].Value; } string rs1 = r1.ToString(); string rs2 = r2.ToString(); int r = 0; if (null != rs1 && null != rs2) { r = rs1.CompareTo(rs2); } else { float rd1 = r1.Get <float>(); float rd2 = r2.Get <float>(); r = rd1.CompareTo(rd2); } if (desc) { r = -r; } return(r); }); v = results; } else if (method == "where") { ObjList results = new ObjList(); IEnumerator enumer = list.GetEnumerator(); while (enumer.MoveNext()) { object val = enumer.Current; BoxedValue r = BoxedValue.NullObject; for (int i = 0; i < m_Args.Count; i++) { m_Args[i].Evaluate(instance, handler, BoxedValue.From(val), args); r = m_Args[i].Value; } if (r.Get <int>() != 0) { results.Add(val); } } v = results; } else if (method == "top") { BoxedValue r = BoxedValue.NullObject; for (int i = 0; i < m_Args.Count; i++) { m_Args[i].Evaluate(instance, handler, iterator, args); r = m_Args[i].Value; } int ct = r.Get <int>(); ObjList results = new ObjList(); IEnumerator enumer = list.GetEnumerator(); while (enumer.MoveNext()) { object val = enumer.Current; if (ct > 0) { results.Add(val); --ct; } } v = results; } } m_Value = BoxedValue.From(v); } else { m_Value = BoxedValue.NullObject; } } for (int i = 0; i < m_Args.Count; i++) { m_Args[i].Evaluate(instance, handler, iterator, args); } }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_UserGuid.Evaluate(instance, handler, iterator, args); m_ItemId.Evaluate(instance, handler, iterator, args); m_ItemNum.Evaluate(instance, handler, iterator, args); }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { //PreCall do all things, so do nothing here. }
protected override void Evaluate(StoryInstance instance, StoryMessageHandler handler, BoxedValue iterator, BoxedValueList args) { m_Key.Evaluate(instance, handler, iterator, args); m_Value.Evaluate(instance, handler, iterator, args); }
protected override bool ExecCommand(StoryInstance instance, StoryMessageHandler handler, long delta, BoxedValue iterator, BoxedValueList args) { var runtime = handler.PeekRuntime(); if (runtime.CompositeReentry) { return(false); } bool ret = false; var stackInfo = handler.PeekLocalInfo(); for (int i = 0; i < m_ArgNames.Count; ++i) { if (i < stackInfo.Args.Count) { instance.SetVariable(m_ArgNames[i], stackInfo.Args[i].Value); } else { instance.SetVariable(m_ArgNames[i], BoxedValue.NullObject); } } foreach (var pair in stackInfo.OptArgs) { instance.SetVariable(pair.Key, pair.Value.Value); } Prepare(handler); runtime = handler.PeekRuntime(); runtime.Arguments = instance.NewBoxedValueList(); runtime.Arguments.Capacity = stackInfo.Args.Count; for (int i = 0; i < stackInfo.Args.Count; i++) { runtime.Arguments.Add(stackInfo.Args[i].Value); } runtime.Iterator = stackInfo.Args.Count; //没有wait之类命令直接执行 runtime.Tick(instance, handler, delta); instance.RecycleBoxedValueList(runtime.Arguments); if (runtime.CommandQueue.Count == 0) { handler.PopRuntime(instance); } else { //遇到wait命令,跳出执行,之后直接在StoryMessageHandler里执行栈顶的命令队列(降低开销) ret = true; } return(ret); }