private void EffectAdded(StatEffect effect) { if (effect.name == effectToMonitor.name) { onEffectStart?.Invoke(); } }
private void EffectEnded(StatEffect effect) { if (effect.name == effectToMonitor.name) { onEffectOver?.Invoke(); } }
/// <summary> /// End an active effect /// </summary> /// <param name="effect"></param> public void EndEffect(StatEffect effect) { StatValue stat; List <DamageModifier> modifiers; // Find modifier targets foreach (StatModifier mod in effect.modifiers) { stat = FindStat(mod.affectedStat); if (stat != null) { stat.RemoveModifier(mod); } modifiers = FindDamageModifiers(mod.affectedStat); foreach (DamageModifier dm in modifiers) { dm.RemoveModifier(mod); } } if (effect.effectParticles != null) { Destroy(effect.effectParticles); } Effects.Remove(effect); onEffectEnded?.Invoke(effect); effect.onEnd?.Invoke(); }
private void EffectResist(StatEffect effect) { DamageDisplay display = Instantiate(displayPrefab, displayParent); display.displayText.color = resistColor; display.displayText.text = "RESIST"; display.transform.position = display.transform.position - new Vector3(0, -0.1f, 0); }
private void AddEffect(StatEffect effect) { // We're just preventing WebGL stacking issues here // This isn't needed for mobile, desktop or platform games if (Time.time - lastAdd > 0.5f) { Instantiate(effectPrefab, effectsContainer).SetEffect(effect); lastAdd = Time.time; } }
public void SetEffect(StatEffect statEffect) { effect = statEffect; effectImage.sprite = effect.sprite; effectName.text = effect.displayName; if (effect.hasLifeSpan) { effectTime.text = Mathf.CeilToInt(effect.RemainingTime) + "sec"; } else { effectTime.text = string.Empty; } }
/// <summary> /// Remove an active effect /// </summary> /// <param name="effect"></param> public void RemoveEffect(StatEffect effect) { if (!Effects.Contains(effect)) { foreach (StatEffect fx in Effects) { if (fx.name == effect.name) { RemoveEffect(fx); return; } } return; } if (!effect.isRemoveable) { return; } StatValue stat; List <DamageModifier> modifiers; // Find modifier targets foreach (StatModifier mod in effect.modifiers) { stat = FindStat(mod.affectedStat); if (stat != null) { stat.RemoveModifier(mod); } modifiers = FindDamageModifiers(mod.affectedStat); foreach (DamageModifier dm in modifiers) { dm.RemoveModifier(mod); } } if (effect.effectParticles != null) { Destroy(effect.effectParticles); } Effects.Remove(effect); onEffectRemoved?.Invoke(effect); effect.onEnd?.Invoke(); }
public void OnEnable() { if (target is StatEffect) { myTarget = (StatEffect)target; // Header modifiersList = new ReorderableList(serializedObject, serializedObject.FindProperty("modifiers"), true, true, true, true); modifiersList.elementHeight = (EditorGUIUtility.singleLineHeight * 9) + 22; modifiersList.drawHeaderCallback = (Rect rect) => { EditorGUI.LabelField(rect, "Stat Modifiers"); }; // Elements modifiersList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { var element = modifiersList.serializedProperty.GetArrayElementAtIndex(index); rect.y += 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("icon"), new GUIContent("Icon", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("displayText"), new GUIContent("Display Text", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("textColor"), new GUIContent("Text Color", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("hideInList"), new GUIContent("Hide In List", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("affectedStat"), new GUIContent("Affected Stat", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("effectType"), new GUIContent("Effect Type", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("valueTarget"), new GUIContent("Target Value", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("valueType"), new GUIContent("Value Type", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.FindPropertyRelative("value"), new GUIContent("Value", null, string.Empty)); rect.y += EditorGUIUtility.singleLineHeight + 2; }; } }
private void Version1_4_Load(Stream stream) { int i, count; string effectName; // Remove all current effects foreach (StatEffect effect in Effects) { onEffectRemoved?.Invoke(effect); } foreach (StatValue stat in Stats) { stat.Load(stream, 1.4f); } damageModifiers.Clear(); count = stream.ReadInt(); for (i = 0; i < count; i++) { DamageModifier instance = ScriptableObject.CreateInstance <DamageModifier>(); instance.Load(stream, 1.4f); damageModifiers.Add(instance); } Effects.Clear(); count = stream.ReadInt(); for (i = 0; i < count; i++) { effectName = stream.ReadStringPacket(); foreach (StatEffect effect in effectList.availableEffects) { if (effect.name == effectName) { StatEffect instance = InstanceStatEffect(effect); instance.RemainingTime = stream.ReadFloat(); Effects.Add(instance); onEffectAdded?.Invoke(instance); break; } } } }
private StatEffect InstanceStatEffect(StatEffect effect) { StatEffect instance = (StatEffect)ScriptableObject.CreateInstance("StatEffect"); instance.displayName = effect.displayName; instance.description = effect.description; instance.sprite = effect.sprite; instance.displayInList = effect.displayInList; instance.category = effect.category; instance.canStack = effect.canStack; instance.resetLifeOnAdd = effect.resetLifeOnAdd; instance.startedText = effect.startedText; instance.endedText = effect.endedText; instance.removedText = effect.removedText; instance.isBenificial = effect.isBenificial; instance.isDetrimental = effect.isDetrimental; instance.isRemoveable = effect.isRemoveable; instance.hasLifeSpan = effect.hasLifeSpan; instance.lifeInSeconds = effect.lifeInSeconds; instance.modifiers = effect.modifiers; instance.cancelEffects = effect.cancelEffects; instance.preventEffects = effect.preventEffects; instance.onEnd = new UnityEvent(); instance.onStart = new UnityEvent(); instance.name = effect.name; if (effect.effectParticles != null) { GameObject go = Instantiate(effect.effectParticles, transform); instance.effectParticles = go; } return(instance); }
internal void AddEffect(StatEffect effect) { ((StatEffectList)target).availableEffects.Add(effect); }
/// <summary> /// Add a new active effect /// </summary> /// <param name="effect"></param> public void AddEffect(StatEffect effect) { StatValue stat; bool addToActive = false; // Check for stack issues if (!effect.canStack) { foreach (StatEffect fx in Effects) { if (fx.name == effect.name) { if (fx.resetLifeOnAdd) { fx.RemainingTime = fx.lifeInSeconds; } return; } } } // Check if effect is prevented foreach (StatEffect fx in Effects) { if (fx.IsEffectPrevented(effect.name)) { return; } } // Check for resist foreach (EffectResistance effectResistance in effectResistances) { if (effectResistance.effect.name == effect.name) { float resistRoll = Random.Range(0f, 1f); if (resistRoll <= effectResistance.resistChance) { onEffectResisted?.Invoke(effect); return; } break; } } // Remove cancelled & prevented effects List <StatEffect> removeByNew = new List <StatEffect>(); foreach (StatEffect fx in Effects) { if (!removeByNew.Contains(fx) && effect.IsEffectCancelled(fx.name) || effect.IsEffectPrevented(fx.name)) { removeByNew.Add(fx); } } foreach (StatEffect fx in removeByNew) { RemoveEffect(fx); } // Find modifier targets foreach (StatModifier mod in effect.modifiers) { stat = FindStat(mod.affectedStat); if (stat == null) { // Apply to modifiers List <DamageModifier> modifiers = FindDamageModifiers(mod.affectedStat); foreach (DamageModifier dm in modifiers) { dm.AddModifier(mod); if (mod.effectType != EffectTypes.Instant) { addToActive = true; } } } else { stat.AddModifier(mod); if (mod.effectType != EffectTypes.Instant) { addToActive = true; } } } // Check for duration only items if (!addToActive && (effect.hasLifeSpan || effect.preventEffects.Count > 0)) { if (!effect.canStack) { bool hasInstance = false; foreach (StatEffect fx in Effects) { if (fx.name == effect.name) { hasInstance = true; break; } } if (!hasInstance) { addToActive = true; } } else { addToActive = true; } } if (addToActive) { StatEffect instance = InstanceStatEffect(effect); instance.Initialize(); Effects.Add(instance); onEffectAdded?.Invoke(instance); } }
private void EffectAdded(StatEffect effect) { Instantiate(effectPrefab, effectsContainer).SetEffect(effect); }
private void DrawDragBox(SerializedProperty values, SerializedProperty effects) { GUILayout.BeginVertical(); GUI.skin.box.alignment = TextAnchor.MiddleCenter; GUI.skin.box.normal.textColor = Color.white; DragBox("Drag & Drop Values/Effects Here"); var dragAreaGroup = GUILayoutUtility.GetLastRect(); switch (Event.current.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!dragAreaGroup.Contains(Event.current.mousePosition)) { break; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (Event.current.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (var dragged in DragAndDrop.objectReferences) { StatEffect effect = dragged as StatEffect; if (effect != null) { if (HasValue(effects, effect)) { EditorUtility.DisplayDialog("Stats Cog", "An effect named '" + effect.name + "' already exists on this StatsCog.", "Ok"); } else { effects.arraySize++; effects.GetArrayElementAtIndex(effects.arraySize - 1).objectReferenceValue = effect; } continue; } StatValue stat = dragged as StatValue; if (stat != null) { if (HasValue(values, stat)) { EditorUtility.DisplayDialog("Stats Cog", "A value named '" + stat.name + "' already exists on this StatsCog.", "Ok"); } else { values.arraySize++; values.GetArrayElementAtIndex(values.arraySize - 1).objectReferenceValue = stat; } continue; } } } serializedObject.ApplyModifiedProperties(); Event.current.Use(); break; } GUILayout.EndVertical(); }
private void DrawEffects() { GUILayout.BeginHorizontal(GUILayout.MaxWidth(750)); GUILayout.BeginVertical(GUILayout.Width(300)); effectsPos = GUILayout.BeginScrollView(effectsPos); statsEditor.DrawEffectsList(); if (stats.effectList != lastEffects) { lastEffects = stats.effectList; if (lastEffects != null) { effectListEditor = (StatEffectListEditor)Editor.CreateEditor(stats.effectList, typeof(StatEffectListEditor)); } } if (effectListEditor == null) { return; } int editId = effectListEditor.DrawEffectList(); if (editId > -1) { editEffect = lastEffects.availableEffects[editId]; effectEditor = (StatEffectEditor)Editor.CreateEditor(editEffect); } GUILayout.EndScrollView(); GUILayout.EndVertical(); GUILayout.Space(32); GUILayout.BeginVertical(GUILayout.Width(300)); if (editEffect == null) { if (addEffect == null) { addEffect = (StatEffect)ScriptableObject.CreateInstance(typeof(StatEffect)); addEffect.name = "New Effect"; effectEditor = (StatEffectEditor)Editor.CreateEditor(addEffect); } effectEditor.serializedObject.Update(); SectionHeader("Create Effect"); effectPos = GUILayout.BeginScrollView(effectPos); effectEditor.DrawInspector(); GUILayout.EndScrollView(); GUILayout.Space(16); if (GUILayout.Button("Create and Add")) { if (string.IsNullOrWhiteSpace(stats.effectFolder)) { stats.effectFolder = Application.dataPath; } string path = EditorUtility.SaveFilePanelInProject("Save Effect", addEffect.displayName, "asset", "Select a location to save the effect", stats.effectFolder); if (path.Length != 0) { effectListEditor.serializedObject.Update(); stats.effectFolder = System.IO.Path.GetDirectoryName(path); addEffect.name = System.IO.Path.GetFileNameWithoutExtension(path); AssetDatabase.CreateAsset(addEffect, path); AssetDatabase.SaveAssets(); effectListEditor.AddEffect(AssetDatabase.LoadAssetAtPath(path, typeof(StatEffect)) as StatEffect); addEffect = null; effectPos = Vector2.zero; GUI.FocusControl("Clear"); effectListEditor.serializedObject.ApplyModifiedProperties(); } } effectEditor.serializedObject.ApplyModifiedProperties(); } else { effectEditor.serializedObject.Update(); SectionHeader("Edit Effect"); effectPos = GUILayout.BeginScrollView(effectPos); effectEditor.DrawInspector(); GUILayout.EndScrollView(); GUILayout.Space(16); if (GUILayout.Button("Done")) { addEffect = null; editEffect = null; GUI.FocusControl("Clear"); Repaint(); } else { effectEditor.serializedObject.ApplyModifiedProperties(); } } GUILayout.EndVertical(); GUILayout.EndHorizontal(); }