Example #1
0
 private void EffectAdded(StatEffect effect)
 {
     if (effect.name == effectToMonitor.name)
     {
         onEffectStart?.Invoke();
     }
 }
Example #2
0
 private void EffectEnded(StatEffect effect)
 {
     if (effect.name == effectToMonitor.name)
     {
         onEffectOver?.Invoke();
     }
 }
Example #3
0
        /// <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;
     }
 }
Example #6
0
 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;
     }
 }
Example #7
0
        /// <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();
        }
Example #8
0
        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;
                };
            }
        }
Example #9
0
        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;
                    }
                }
            }
        }
Example #10
0
        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);
        }
Example #11
0
 internal void AddEffect(StatEffect effect)
 {
     ((StatEffectList)target).availableEffects.Add(effect);
 }
Example #12
0
        /// <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);
            }
        }
Example #13
0
 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();
        }
Example #15
0
        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();
        }