protected override bool ExecCommand(StoryInstance instance, long delta) { int ct = 0; for (int i = 0; i < m_MsgIds.Count; i++) { ct += instance.CountMessage(m_MsgIds[i].Value); } bool ret = false; if (ct <= 0) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } return(ret); }
protected override bool ExecCommand(StoryInstance instance, long delta) { if (m_StartTime <= 0) { long startTime = GameFramework.TimeUtility.GetLocalMilliseconds(); m_StartTime = startTime; } bool triggered = false; string _namespace = instance.Namespace; if (string.IsNullOrEmpty(_namespace)) { for (int i = 0; i < m_MsgIds.Count; i++) { long time = instance.GetMessageTriggerTime(m_MsgIds[i].Value); if (time > m_StartTime) { triggered = true; break; } } } else { for (int i = 0; i < m_MsgIds.Count; i++) { long time = instance.GetMessageTriggerTime(string.Format("{0}:{1}", _namespace, m_MsgIds[i].Value)); if (time > m_StartTime) { triggered = true; break; } } } bool ret = false; if (triggered) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } return(ret); }
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); } }
protected override bool ExecCommand(StoryInstance instance, long delta) { bool triggered = false; string name = m_Name.Value; float radius = m_Radius.Value; string type = m_Type.Value; string eventName = m_EventName.Value; UnityEngine.GameObject obj = UnityEngine.GameObject.Find(name); if (null != obj) { UnityEngine.Vector3 pos = obj.transform.position; if (type == "myself") { EntityViewModel view = EntityController.Instance.GetEntityViewById(ClientModule.Instance.LeaderID); if (null != view && null != view.Actor) { if ((view.Actor.transform.position - pos).sqrMagnitude < radius * radius) { GfxStorySystem.Instance.SendMessage(eventName, name, radius, type); triggered = true; } } } else if (type == "anyenemy" || type == "anyfriend") { EntityInfo myself = ClientModule.Instance.GetEntityById(ClientModule.Instance.LeaderID); ClientModule.Instance.KdTree.Query(pos.x, pos.y, pos.z, radius, (float distSqr, KdTreeObject kdObj) => { if (type == "anyenemy" && EntityInfo.GetRelation(myself, kdObj.Object) == CharacterRelation.RELATION_ENEMY || type == "anyfriend" && EntityInfo.GetRelation(myself, kdObj.Object) == CharacterRelation.RELATION_FRIEND) { GfxStorySystem.Instance.SendMessage(eventName, name, radius, type); triggered = true; return(false); } return(true); }); } } string varName = m_SetVar.Value; object varVal = m_SetVal.Value; object elseVal = m_ElseSetVal.Value; if (triggered) { instance.SetVariable(varName, varVal); } else { instance.SetVariable(varName, elseVal); } return(false); }
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); }
protected override bool ExecCommand(StoryInstance instance, StoryMessageHandler handler, long delta) { Scene scene = instance.Context as Scene; if (null != scene) { bool triggered = false; Vector3 pos = m_Pos.Value; float radius = m_Radius.Value; string type = m_Type.Value; string eventName = m_EventName.Value; if (type == "user") { scene.KdTree.QueryWithFunc(pos, radius, (float distSqr, KdTreeObject kdObj) => { if (kdObj.Object.EntityType != (int)EntityTypeEnum.Hero) { scene.StorySystem.SendMessage(eventName, pos, radius, type); triggered = true; return(false); } return(true); }); } else if (type == "npc") { scene.KdTree.QueryWithFunc(pos, radius, (float distSqr, KdTreeObject kdObj) => { if (kdObj.Object.EntityType != (int)EntityTypeEnum.Hero) { scene.StorySystem.SendMessage(eventName, pos, radius, type); triggered = true; return(false); } return(true); }); } string varName = m_SetVar.Value; var varVal = m_SetVal.Value; var elseVal = m_ElseSetVal.Value; if (triggered) { instance.SetVariable(varName, varVal); } else { instance.SetVariable(varName, elseVal); } } return(false); }
public void Evaluate(StoryInstance instance, object iterator, object[] args) { StackElementInfo stackInfo = NewStackElementInfo(); //调用实参部分需要在栈建立之前运算,结果需要记录在栈上 for (int i = 0; i < m_LoadedArgs.Count; ++i) { stackInfo.m_Args.Add(m_LoadedArgs[i].Clone()); } for (int i = 0; i < stackInfo.m_Args.Count; i++) { stackInfo.m_Args[i].Evaluate(instance, iterator, args); } //实参处理完,进入函数体执行,创建新的栈 PushStack(instance, stackInfo); try { for (int i = 0; i < m_ArgNames.Count && i < stackInfo.m_Args.Count; ++i) { instance.SetVariable(m_ArgNames[i], stackInfo.m_Args[i].Value); } Prepare(stackInfo); stackInfo.m_HaveValue = true; for (int i = 0; i < stackInfo.m_Commands.Count; ++i) { //函数调用命令需要忽略其中的wait指令(从而不会出现“挂起-恢复”行为),所以这里传的delta值是一个很大的值,目的是为了让wait直接结束 stackInfo.m_Commands[i].Execute(instance, StoryValueHelper.c_MaxWaitCommandTime, iterator, args); } instance.TryGetVariable(m_ReturnName, out stackInfo.m_Value); } finally { PopStack(instance); } }
protected override bool ExecCommand(StoryInstance instance, StoryMessageHandler handler, long delta) { if (m_Value.HaveValue) { instance.SetVariable(m_VarName, m_Value.Value); } return(false); }
protected override bool ExecCommand(StoryInstance instance, StoryMessageHandler handler, long delta) { bool ret = false; UserThread userThread = instance.Context as UserThread; if (null != userThread) { if (m_StartTime <= 0) { long startTime = GameFramework.TimeUtility.GetLocalMilliseconds(); m_StartTime = startTime; } bool triggered = false; for (int i = 0; i < m_MsgIds.Count; i++) { long time = instance.GetMessageTriggerTime(m_MsgIds[i].Value); if (time > m_StartTime) { triggered = true; break; } } if (triggered) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } } return(ret); }
protected override bool ExecCommand(StoryInstance instance, long delta) { if (m_VarName.HaveValue && m_Value.HaveValue) { string varName = m_VarName.Value; instance.SetVariable(varName, m_Value.Value); } return(false); }
protected override void Evaluate(StoryInstance instance, object iterator, object[] args) { if (m_Stack.Count > 0) { StackElementInfo stackInfo = m_Stack.Peek(); for (int i = 0; i < m_ArgNames.Count; ++i) { if (i < stackInfo.m_Args.Count) { instance.SetVariable(m_ArgNames[i], stackInfo.m_Args[i].Value); } else { instance.SetVariable(m_ArgNames[i], null); } } } }
protected override bool ExecCommand(StoryInstance instance, long delta) { int ct = 0; string _namespace = instance.Namespace; if (string.IsNullOrEmpty(_namespace)) { for (int i = 0; i < m_MsgIds.Count; i++) { ct += instance.CountMessage(m_MsgIds[i].Value); } } else { for (int i = 0; i < m_MsgIds.Count; i++) { ct += instance.CountMessage(string.Format("{0}:{1}", _namespace, m_MsgIds[i].Value)); } } bool ret = false; if (ct <= 0) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } return(ret); }
protected override bool ExecCommand(StoryInstance instance, StoryMessageHandler handler, long delta) { bool ret = false; UserThread userThread = instance.Context as UserThread; if (null != userThread) { int ct = 0; for (int i = 0; i < m_MsgIds.Count; i++) { ct += userThread.StorySystem.CountMessage(m_MsgIds[i].Value); } if (ct <= 0) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } } return(ret); }
protected override bool ExecCommand(StoryInstance instance, long delta) { int ct = 0; for (int i = 0; i < m_MsgIds.Count; i++) { ct += instance.CountMessage(m_MsgIds[i].Value); } bool ret = false; if (ct <= 0) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } return ret; }
protected override bool ExecCommand(StoryInstance instance, long delta) { int ct = 0; string _namespace = instance.Namespace; if (string.IsNullOrEmpty(_namespace)) { for (int i = 0; i < m_MsgIds.Count; i++) { ct += instance.CountMessage(m_MsgIds[i].Value); } } else { for (int i = 0; i < m_MsgIds.Count; i++) { ct += instance.CountMessage(string.Format("{0}:{1}", _namespace, m_MsgIds[i].Value)); } } bool ret = false; if (ct <= 0) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } return ret; }
protected override bool ExecCommand(StoryInstance instance, long delta) { if (m_StartTime <= 0) { long startTime = GameFramework.TimeUtility.GetLocalMilliseconds(); m_StartTime = startTime; } bool triggered = false; string _namespace = instance.Namespace; if (string.IsNullOrEmpty(_namespace)) { for (int i = 0; i < m_MsgIds.Count; i++) { long time = instance.GetMessageTriggerTime(m_MsgIds[i].Value); if (time > m_StartTime) { triggered = true; break; } } } else { for (int i = 0; i < m_MsgIds.Count; i++) { long time = instance.GetMessageTriggerTime(string.Format("{0}:{1}", _namespace, m_MsgIds[i].Value)); if (time > m_StartTime) { triggered = true; break; } } } bool ret = false; if (triggered) { string varName = m_SetVar.Value; object varVal = m_SetVal.Value; instance.SetVariable(varName, varVal); } else { int curTime = m_CurTime; m_CurTime += (int)delta; if (curTime <= m_TimeoutVal.Value) { ret = true; } else { string varName = m_TimeoutSetVar.Value; object varVal = m_TimeoutSetVal.Value; instance.SetVariable(varName, varVal); } } return ret; }
private static void AddVariable(StoryInstance instance, string name, UnityEngine.GameObject control) { instance.SetVariable(name, control); UnityEngine.UI.Text text = control.GetComponent <UnityEngine.UI.Text>(); if (null != text) { instance.SetVariable(string.Format("{0}_Text", name), text); } UnityEngine.UI.Image image = control.GetComponent <UnityEngine.UI.Image>(); if (null != image) { instance.SetVariable(string.Format("{0}_Image", name), image); } UnityEngine.UI.RawImage rawImage = control.GetComponent <UnityEngine.UI.RawImage>(); if (null != rawImage) { instance.SetVariable(string.Format("{0}_RawImage", name), rawImage); } UnityEngine.UI.Button button = control.GetComponent <UnityEngine.UI.Button>(); if (null != button) { instance.SetVariable(string.Format("{0}_Button", name), button); } UnityEngine.UI.Dropdown dropdown = control.GetComponent <UnityEngine.UI.Dropdown>(); if (null != dropdown) { instance.SetVariable(string.Format("{0}_Dropdown", name), dropdown); } UnityEngine.UI.InputField inputField = control.GetComponent <UnityEngine.UI.InputField>(); if (null != inputField) { instance.SetVariable(string.Format("{0}_Input", name), inputField); } UnityEngine.UI.Slider slider = control.GetComponent <UnityEngine.UI.Slider>(); if (null != inputField) { instance.SetVariable(string.Format("{0}_Slider", name), slider); } UnityEngine.UI.Toggle toggle = control.GetComponent <UnityEngine.UI.Toggle>(); if (null != toggle) { instance.SetVariable(string.Format("{0}_Toggle", name), toggle); } UnityEngine.UI.ToggleGroup toggleGroup = control.GetComponent <UnityEngine.UI.ToggleGroup>(); if (null != toggleGroup) { instance.SetVariable(string.Format("{0}_ToggleGroup", name), toggleGroup); } UnityEngine.UI.Scrollbar scrollbar = control.GetComponent <UnityEngine.UI.Scrollbar>(); if (null != scrollbar) { instance.SetVariable(string.Format("{0}_Scrollbar", name), scrollbar); } }
protected override void Evaluate(StoryInstance instance, object iterator, object[] args) { if (m_Stack.Count > 0) { StackElementInfo stackInfo = m_Stack.Peek(); for (int i = 0; i < m_ArgNames.Count && i < stackInfo.m_Args.Count; ++i) { instance.SetVariable(m_ArgNames[i], stackInfo.m_Args[i].Value); } } }