using System.Collections; using System.Collections.Generic; using UnityEngine; using RPGCreationKit; namespace RPGCreationKit { /// /// Determines in terms of % what are the biggest factors to calculate aggro. /// public static class AggroSettings { public enum Modifier { Distance = 0, Damage = 1, Weapon = 2 } // All values must sum up to 100 public static int DISTANCE_MODIFIER = 70; public static int DAMAGE_MODIFIER = 20; public static int WEAPON_MODIFIER = 10; // Other public static float COMBAT_PULSE_RATE = 2; public static float COMBAT_PULSE_REDUCTION = 20; public static int SortByAggro(AggroInfo a1, AggroInfo a2) { return a1.aggroValue.CompareTo(a2.aggroValue); } } /// /// Class that contains information about the aggro of an enemy/target in the RPG Creation Kit. /// [System.Serializable] public class AggroInfo { public AggroInfo(float _initialValue) { SetAggroValue(_initialValue); } // The aggro value, which will determine which is the most dangerous target and the one to attack first. public float aggroValue = 50; /// /// Directly sets the aggro value without any check [Range: 0-100] and returns it. /// public float SetAggroValue(float _value) { aggroValue = _value; return (aggroValue = Mathf.Clamp(aggroValue, 0, 100)); } /// /// Alters and returns the aggro value by an event-type call. When this is called the aggro value sums up to the current aggro value the formula: DISTANCE: (MODIFIER_VALUE / _value) | OTHERS: ((MODIFIER_VALUE * _value) / 100) /// /// /// public float AlterAggroValue(AggroSettings.Modifier _modifier, float _value) { switch (_modifier) { case AggroSettings.Modifier.Distance: // If distance is less or equal than 4, pretend it's 1 so we get an high aggro influence since we're very close to the target if (_value <= 4) _value = 1; aggroValue += (AggroSettings.DISTANCE_MODIFIER / _value); break; case AggroSettings.Modifier.Damage: aggroValue += (AggroSettings.DAMAGE_MODIFIER * _value) / 100; break; case AggroSettings.Modifier.Weapon: aggroValue += (AggroSettings.WEAPON_MODIFIER * _value) / 100; break; default: break; } return (aggroValue = Mathf.Clamp(aggroValue, 0, 100)); } /// /// Reduces the current aggro value of AggroSettings.COMBAT_PULSE_REDUCTION and returns it. /// /// public float CombatPulse() { aggroValue -= AggroSettings.COMBAT_PULSE_REDUCTION; return (aggroValue = Mathf.Clamp(aggroValue, 0, 100)); } } }