public override void Deserialize(DataStream reader) { base.Deserialize(reader); ExecutorInfo = ExecutorInfo.Deserialize(reader); TriggerTime = (SideEffectExecute.TriggerTime)reader.ReadSInt32(); TriggerRange = (SideEffectExecute.TriggerRange)reader.ReadSInt32(); }
public List <SideEffectExecute> GetSideEffectExecutes(SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange) { List <SideEffectExecute> res = new List <SideEffectExecute>(); if (SideEffectExecutes_Dict.ContainsKey(triggerTime)) { Dictionary <SideEffectExecute.TriggerRange, List <SideEffectExecute> > temp = SideEffectExecutes_Dict[triggerTime]; if (temp.ContainsKey(triggerRange)) { res.AddRange(temp[triggerRange]); } } return(res); }
IEnumerator Co_ShowSideEffectBloom(SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange, Color color, float duration) { if (triggerTime == SideEffectExecute.TriggerTime.OnMechDie && triggerRange == SideEffectExecute.TriggerRange.Self) { MechTriggerIconComponent.IconJump(MechTriggerIcon.IconTypes.Die); } else { MechTriggerIconComponent.IconJump(MechTriggerIcon.IconTypes.Trigger); } MechBloomComponent.SetSideEffectTriggerBloomShow(true); MechBloomComponent.SetSideEffectTriggerBloomColor(color, 2); AudioManager.Instance.SoundPlay("sfx/OnSE"); yield return(new WaitForSeconds(duration)); MechBloomComponent.SetSideEffectTriggerBloomShow(false); BattleEffectsManager.Instance.Effect_Main.EffectEnd(); }
/// <summary> /// When something happens in game, invoke events by TriggerTime enum. /// Invoker info can be found in executorInfo. /// TriggerTime enum is Flag. Master trigger can be triggered by Sub trigger -> e.g. OnHeroInjured also triggers OnMechInjured /// This method is often used in game logic. /// (e.g. BattlePlayer.MyGameManager.EventManager.Invoke(SideEffectBundle.TriggerTime.OnSoldierKill, new ExecutorInfo(BattlePlayer.ClientId, mechId: M_MechID, targetMechId: targetMech.M_MechID));) /// </summary> /// <param name="tt"></param> /// <param name="executorInfo"></param> public void Invoke(SideEffectExecute.TriggerTime tt, ExecutorInfo executorInfo) { foreach (SideEffectExecute.TriggerTime triggerTime in Enum.GetValues(typeof(SideEffectExecute.TriggerTime))) { if ((tt & triggerTime) == tt) // this is a Flag Enum compare { InvokeTriggerTimeQueue.Enqueue(new InvokeInfo(triggerTime, executorInfo)); //all TriggerTimes enqueue } } while (InvokeTriggerTimeQueue.Count > 0) //Dequeue every trigger time and invoke. { InvokeInfo invokeInfo = InvokeTriggerTimeQueue.Dequeue(); InvokeCore(invokeInfo); } RemoveAllUselessSEEs(); // if some mechs are dead or cards are removed, their SideEffectExecute would be removed from EventManager OnEventInvokeEndHandler(); //Ready to send data to client ends. }
public void Invoke_RemoveSEE(SideEffectExecute.TriggerTime tt, ExecutorInfo executorInfo) { Dictionary <int, SideEffectExecute> seeDict = RemoveEvents[tt]; SideEffectExecute[] sees = seeDict.Values.ToArray(); for (int i = 0; i < sees.Length; i++) { SideEffectExecute see = sees[i]; if (ObsoleteSEEs.ContainsKey(see.ID)) { continue; //To prevent removed side effects from being removed again. } if (seeDict.ContainsKey(see.ID)) { bool isTrigger = IsExecuteTrigger(executorInfo, see.M_ExecutorInfo, see.M_ExecuteSetting.RemoveTriggerRange); if (isTrigger) { Trigger_TryRemove(see); // invoke main trigger_remove method. (some side effects like buffs have a remove_time attribute. e.g. Remove this buff after 3 turns) } } } RemoveAllUselessSEEs(); }
private void InvokeCore(InvokeInfo invokeInfo) { SideEffectExecute.TriggerTime tt = invokeInfo.TriggerTime; ExecutorInfo executorInfo = invokeInfo.ExecutorInfo; Dictionary <int, SideEffectExecute> seeDict = Events[tt]; SideEffectExecute[] sees = seeDict.Values.ToArray(); for (int i = 0; i < sees.Length; i++) { SideEffectExecute see = sees[i]; if (ObsoleteSEEs.ContainsKey(see.ID)) { continue; //To prevent executed side effects from being executed again. } if (seeDict.ContainsKey(see.ID)) { bool isTrigger = false; if (see.M_ExecuteSetting is ScriptExecuteSettingBase scriptExecuteSettingBase) { isTrigger = scriptExecuteSettingBase.IsTrigger(executorInfo, see.M_ExecutorInfo); } else { isTrigger = IsExecuteTrigger(executorInfo, see.M_ExecutorInfo, see.M_ExecuteSetting.TriggerRange); //To check out if this event invokes any side effect. } if (isTrigger) { Trigger(see, executorInfo, tt, see.M_ExecuteSetting.TriggerRange); // invoke main trigger method. } } } Invoke_RemoveSEE(tt, executorInfo); //Remove executed side effects with zero time left. }
public ScriptExecuteSettingBase(string name, SortedDictionary <string, string> descRaws, SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange, int triggerTimes, int triggerDelayTimes, SideEffectExecute.TriggerTime removeTriggerTime, SideEffectExecute.TriggerRange removeTriggerRange, int removeTriggerTimes, int removeTriggerDelayTimes) : base(triggerTime, triggerRange, triggerTimes, triggerDelayTimes, removeTriggerTime, removeTriggerRange, removeTriggerTimes, removeTriggerDelayTimes) { Name = name; DescRaws = descRaws; InitSideEffectParam(); }
public ShowSideEffectTriggeredRequest(ExecutorInfo executorInfo, SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange) { ExecutorInfo = executorInfo; TriggerTime = triggerTime; TriggerRange = triggerRange; }
public override void OnShowEffects(SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange) { BattleEffectsManager.Instance.Effect_Main.EffectsShow(Co_ShowSideEffectBloom(triggerTime, triggerRange, ClientUtils.HTMLColorToColor("#00FFDA"), 0.4f * BattleEffectsManager.AnimationSpeed), "ShowSideEffectBloom"); }
public override void OnShowEffects(SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange) { BattleEffectsManager.Instance.Effect_Main.EffectsShow(Co_ShowSideEffectBloom(ClientUtils.HTMLColorToColor(CardInfo.GetCardColor()), 0.5f), "ShowSideEffectBloom"); }
public void Initialize(SideEffectExecute see, UnityAction onRefreshText, bool isReadOnly, bool isExecuteSettingTypeChanged) { Initializing = true; foreach (PropertyFormRow cpfr in CardPropertyFormRows) { cpfr.PoolRecycle(); } CardPropertyFormRows.Clear(); bool isScriptExecuteSetting = see.M_ExecuteSetting is ScriptExecuteSettingBase; PFR_ScriptExecuteSettingType.gameObject.SetActive(isScriptExecuteSetting); ScriptExecuteSettingBase sesb = null; if (isScriptExecuteSetting) { sesb = (ScriptExecuteSettingBase)see.M_ExecuteSetting; ScriptExecuteSettingTypeDropdown.options.Clear(); foreach (string option in AllScriptExecuteSettings.ScriptExecuteSettingsNameDict.Keys.ToList()) { ScriptExecuteSettingTypeDropdown.options.Add(new Dropdown.OptionData(option)); } ScriptExecuteSettingTypeDropdown.onValueChanged.RemoveAllListeners(); SetScriptExecuteSettingType(sesb.Name); ScriptExecuteSettingTypeDropdown.onValueChanged.AddListener(delegate(int index) { string scriptExecuteSettingName = ScriptExecuteSettingTypeDropdown.options[index].text; ScriptExecuteSettingBase newSESB = AllScriptExecuteSettings.GetScriptExecuteSetting(scriptExecuteSettingName); if (see != null) { see.M_ExecuteSetting = newSESB; } Initialize(see, onRefreshText, isReadOnly, false); onRefreshText(); StartCoroutine(ClientUtils.UpdateLayout((RectTransform)ExecuteRowContainer)); StartCoroutine(ClientUtils.UpdateLayout((RectTransform)UIManager.Instance.GetBaseUIForm <CardEditorPanel>().CardPropertiesContainer)); }); CardEditorPanel_Params.GenerateParamRows(null, sesb.M_SideEffectParam, onRefreshText, delegate { Initialize(see, onRefreshText, isReadOnly, false); }, ExecuteRowContainer, CardPropertyFormRows, null, delegate { StartCoroutine(ClientUtils.UpdateLayout((RectTransform)ExecuteRowContainer)); StartCoroutine(ClientUtils.UpdateLayout((RectTransform)UIManager.Instance.GetBaseUIForm <CardEditorPanel>().CardPropertiesContainer)); }); } PropertyFormRow cpfr_TriggerRange = null; UnityAction <string, bool> _setValueTriggerRange = null; PropertyFormRow cpfr_TriggerTime = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.Dropdown, ExecuteRowContainer, "CardEditorPanel_TriggerTime", delegate(string value_str) { SideEffectExecute.TriggerTime value = (SideEffectExecute.TriggerTime)Enum.Parse(typeof(SideEffectExecute.TriggerTime), value_str); see.M_ExecuteSetting.TriggerTime = value; List <string> trList = SideEffectExecute.GetTriggerRangeListByTriggerTime(see.M_ExecuteSetting.TriggerTime); ((PropertyFormRow_Dropdown)cpfr_TriggerRange).RefreshDropdownOptionList(trList); if (!Initializing && (see.ExecuteSettingType == SideEffectExecute.ExecuteSettingTypes.Scripts || see.ExecuteSettingType == SideEffectExecute.ExecuteSettingTypes.Others)) { _setValueTriggerRange(trList[0], true); } onRefreshText?.Invoke(); }, out UnityAction <string, bool> _setValueTriggerTime, sesb != null ? ScriptExecuteSettingBase.HashSetTriggerTimeToListString(sesb.ValidTriggerTimes) : triggerTimeTypeList); CardPropertyFormRows.Add(cpfr_TriggerTime); cpfr_TriggerTime.SetReadOnly(isReadOnly); cpfr_TriggerRange = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.Dropdown, ExecuteRowContainer, "CardEditorPanel_TriggerRange", delegate(string value_str) { SideEffectExecute.TriggerRange value = (SideEffectExecute.TriggerRange)Enum.Parse(typeof(SideEffectExecute.TriggerRange), value_str); see.M_ExecuteSetting.TriggerRange = value; onRefreshText?.Invoke(); }, out _setValueTriggerRange, SideEffectExecute.GetTriggerRangeListByTriggerTime(see.M_ExecuteSetting.TriggerTime)); CardPropertyFormRows.Add(cpfr_TriggerRange); cpfr_TriggerRange.SetReadOnly(isReadOnly); ((PropertyFormRow_Dropdown)cpfr_TriggerRange).RefreshDropdownOptionList(SideEffectExecute.GetTriggerRangeListByTriggerTime(see.M_ExecuteSetting.TriggerTime)); PropertyFormRow cpfr_TriggerTimes = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.InputField, ExecuteRowContainer, "CardEditorPanel_TriggerTimes", delegate(string value_str) { if (int.TryParse(value_str, out int value)) { see.M_ExecuteSetting.TriggerTimes = value; onRefreshText?.Invoke(); } }, out UnityAction <string, bool> _setValueTriggerTimes); CardPropertyFormRows.Add(cpfr_TriggerTimes); cpfr_TriggerTimes.SetReadOnly(sesb != null ? sesb.LockedTriggerTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES : isReadOnly); PropertyFormRow cpfr_TriggerDelayTimes = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.InputField, ExecuteRowContainer, "CardEditorPanel_TriggerDelayTimes", delegate(string value_str) { if (int.TryParse(value_str, out int value)) { see.M_ExecuteSetting.TriggerDelayTimes = value; onRefreshText?.Invoke(); } }, out UnityAction <string, bool> _setValueTriggerDelayTimes); CardPropertyFormRows.Add(cpfr_TriggerDelayTimes); cpfr_TriggerDelayTimes.SetReadOnly(sesb != null ? sesb.LockedTriggerDelayTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES : isReadOnly); PropertyFormRow cpfr_RemoveTriggerRange = null; UnityAction <string, bool> _setValueRemoveTriggerRange = null; PropertyFormRow cpfr_RemoveTriggerTime = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.Dropdown, ExecuteRowContainer, "CardEditorPanel_RemoveTriggerTime", delegate(string value_str) { SideEffectExecute.TriggerTime value = (SideEffectExecute.TriggerTime)Enum.Parse(typeof(SideEffectExecute.TriggerTime), value_str); see.M_ExecuteSetting.RemoveTriggerTime = value; List <string> trList = SideEffectExecute.GetTriggerRangeListByTriggerTime(see.M_ExecuteSetting.RemoveTriggerTime); ((PropertyFormRow_Dropdown)cpfr_RemoveTriggerRange).RefreshDropdownOptionList(trList); if (!Initializing && (see.ExecuteSettingType == SideEffectExecute.ExecuteSettingTypes.Scripts || see.ExecuteSettingType == SideEffectExecute.ExecuteSettingTypes.Others)) { _setValueRemoveTriggerRange(trList[0], true); } onRefreshText?.Invoke(); }, out UnityAction <string, bool> _setValueRemoveTriggerTime, sesb != null ? ScriptExecuteSettingBase.HashSetTriggerTimeToListString(sesb.ValidRemoveTriggerTimes) : triggerTimeTypeList); CardPropertyFormRows.Add(cpfr_RemoveTriggerTime); cpfr_RemoveTriggerTime.SetReadOnly(isReadOnly); cpfr_RemoveTriggerRange = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.Dropdown, ExecuteRowContainer, "CardEditorPanel_RemoveTriggerRange", delegate(string value_str) { SideEffectExecute.TriggerRange value = (SideEffectExecute.TriggerRange)Enum.Parse(typeof(SideEffectExecute.TriggerRange), value_str); see.M_ExecuteSetting.RemoveTriggerRange = value; onRefreshText?.Invoke(); }, out _setValueRemoveTriggerRange, SideEffectExecute.GetTriggerRangeListByTriggerTime(see.M_ExecuteSetting.RemoveTriggerTime)); CardPropertyFormRows.Add(cpfr_RemoveTriggerRange); cpfr_RemoveTriggerRange.SetReadOnly(isReadOnly); ((PropertyFormRow_Dropdown)cpfr_RemoveTriggerRange).RefreshDropdownOptionList(SideEffectExecute.GetTriggerRangeListByTriggerTime(see.M_ExecuteSetting.RemoveTriggerTime)); PropertyFormRow cpfr_RemoveTriggerTimes = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.InputField, ExecuteRowContainer, "CardEditorPanel_RemoveTriggerTimes", delegate(string value_str) { if (int.TryParse(value_str, out int value)) { see.M_ExecuteSetting.RemoveTriggerTimes = value; onRefreshText?.Invoke(); } }, out UnityAction <string, bool> _setValueRemoveTriggerTimes); CardPropertyFormRows.Add(cpfr_RemoveTriggerTimes); cpfr_RemoveTriggerTimes.SetReadOnly(sesb != null ? sesb.LockedRemoveTriggerTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES : isReadOnly); PropertyFormRow cpfr_RemoveTriggerDelayTimes = PropertyFormRow.BaseInitialize(PropertyFormRow.CardPropertyFormRowType.InputField, ExecuteRowContainer, "CardEditorPanel_RemoveTriggerDelayTimes", delegate(string value_str) { if (int.TryParse(value_str, out int value)) { see.M_ExecuteSetting.RemoveTriggerDelayTimes = value; onRefreshText?.Invoke(); } }, out UnityAction <string, bool> _setValueRemoveTriggerDelayTimes); CardPropertyFormRows.Add(cpfr_RemoveTriggerDelayTimes); cpfr_RemoveTriggerDelayTimes.SetReadOnly(sesb != null ? sesb.LockedRemoveTriggerDelayTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES : isReadOnly); _setValueTriggerTime(sesb != null ? (sesb.ValidTriggerTimes.Count != 0 ? sesb.ValidTriggerTimes.ToList()[0].ToString() : SideEffectExecute.TriggerTime.None.ToString()) : see.M_ExecuteSetting.TriggerTime.ToString(), isExecuteSettingTypeChanged); _setValueTriggerRange(see.M_ExecuteSetting.TriggerRange.ToString(), isExecuteSettingTypeChanged); _setValueTriggerTimes(sesb != null ? (sesb.LockedTriggerTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES ? sesb.LockedTriggerTimes.ToString() : see.M_ExecuteSetting.TriggerTimes.ToString()) : see.M_ExecuteSetting.TriggerTimes.ToString(), isExecuteSettingTypeChanged); _setValueTriggerDelayTimes(sesb != null ? (sesb.LockedTriggerDelayTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES ? sesb.LockedTriggerDelayTimes.ToString() : see.M_ExecuteSetting.TriggerDelayTimes.ToString()) : see.M_ExecuteSetting.TriggerDelayTimes.ToString(), isExecuteSettingTypeChanged); _setValueRemoveTriggerTime(sesb != null ? (sesb.ValidRemoveTriggerTimes.Count != 0 ? sesb.ValidRemoveTriggerTimes.ToList()[0].ToString() : SideEffectExecute.TriggerTime.None.ToString()) : see.M_ExecuteSetting.RemoveTriggerTime.ToString(), isExecuteSettingTypeChanged); _setValueRemoveTriggerRange(see.M_ExecuteSetting.RemoveTriggerRange.ToString(), isExecuteSettingTypeChanged); _setValueRemoveTriggerTimes(sesb != null ? (sesb.LockedRemoveTriggerTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES ? sesb.LockedRemoveTriggerTimes.ToString() : see.M_ExecuteSetting.RemoveTriggerTimes.ToString()) : see.M_ExecuteSetting.RemoveTriggerTimes.ToString(), isExecuteSettingTypeChanged); _setValueRemoveTriggerDelayTimes(sesb != null ? (sesb.LockedRemoveTriggerDelayTimes != ScriptExecuteSettingBase.UNLOCKED_EXECUTESETTING_TIMES ? sesb.LockedRemoveTriggerDelayTimes.ToString() : see.M_ExecuteSetting.RemoveTriggerDelayTimes.ToString()) : see.M_ExecuteSetting.RemoveTriggerDelayTimes.ToString(), isExecuteSettingTypeChanged); Initializing = false; }
public abstract void OnShowEffects(SideEffectExecute.TriggerTime triggerTime, SideEffectExecute.TriggerRange triggerRange);
private void Trigger(SideEffectExecute see, ExecutorInfo ei, SideEffectExecute.TriggerTime tt, SideEffectExecute.TriggerRange tr) { if (see.M_ExecuteSetting.TriggerDelayTimes > 0) //TriggerDelayTimes decreases and trigger the event when it's 0 { see.M_ExecuteSetting.TriggerDelayTimes--; return; } else { if (see.M_ExecuteSetting.TriggerTimes > 0) //TriggerTimes decreases every time it triggers and stop when it's 0 { //Trigger's trigger -- which triggers when other events are being triggered. bool isTriggerTrigger = false; if (tt == SideEffectExecute.TriggerTime.OnTrigger) //Give sideeffect executing info to trigger's trigger for modifying. { foreach (SideEffectBase se in see.SideEffectBases) { if (se is PlayerBuffSideEffects buffSEE) { foreach (SideEffectBase sub_se in buffSEE.Sub_SideEffect) { if (sub_se is ITrigger triggerSEE) { triggerSEE.PeekSEE = InvokeStack.Peek(); if (triggerSEE.IsTrigger(ei)) { isTriggerTrigger = true; } } } } } } if (tt == SideEffectExecute.TriggerTime.OnTrigger && !isTriggerTrigger) { return; } //Trigger's trigger End see.M_ExecuteSetting.TriggerTimes--; ShowSideEffectTriggeredRequest request = new ShowSideEffectTriggeredRequest(see.M_ExecutorInfo, tt, tr); //Send request to client OnEventInvokeHandler(request); InvokeStack.Push(see); Invoke(SideEffectExecute.TriggerTime.OnTrigger, ei); foreach (SideEffectBase se in see.SideEffectBases) { se.Execute(ei); } InvokeStack.Pop(); } else if (see.M_ExecuteSetting.TriggerTimes == 0) { if (!ObsoleteSEEs.ContainsKey(see.ID)) { ObsoleteSEEs.Add(see.ID, see); } } } }
public InvokeInfo(SideEffectExecute.TriggerTime triggerTime, ExecutorInfo executorInfo) { TriggerTime = triggerTime; ExecutorInfo = executorInfo; }