Pedro Gomes fdd55142f9 Small class tunning & Rework item drops
- Slight increase to priest, necro and mage scaling
- Updated overall item drops on all enemies:
   - bosses are guaranteed to drop one item
   - drops are weighted and with min/max difficulty restrictions
2025-01-01 20:39:41 +00:00

125 lines
5.0 KiB
C#

using Kryz.CharacterStats;
using Kryz.CharacterStats.Examples;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "InstantEffect", menuName = "RiftMayhem/AbilitySystem/Effects/Instant Effect", order = 1)]
public class InstantValueEffect : BaseEffect
{
public float baseValue;
public DamageType damageType = DamageType.Attack;
[Header("Optional Modifiers for damage / healing based on target")]
public float AlliedTargetMultiplier = 1f;
public float EnemyTargetMultiplier = 1f;
[Header("Optional apply this to class resource instead:")]
public bool applyToClassResourceInstead = false;
public bool applyToSelfResourceInsteadOfHit = false;
Health targetHealth;
ClassResource classResource;
private float finalValue;
private CharacterStats stats;
private DamageOutputModifierEffectInstance damageOutputModifier;
public override void ApplyEffect(Taggable user, List<Taggable> targets)
{
if (user == null) return;
foreach (Taggable target in targets)
{
if (target == null) continue;
//Debug.Log($"Applied instant effect of {GetCorrectValueSign(user, target)} to target {target.name}");
if(applyToClassResourceInstead)
{
if (user.IsMinion()) return;
if(applyToSelfResourceInsteadOfHit)
{
classResource = user.GetComponent<ClassResource>();
classResource.ChangeValue(GetCorrectValueSign(user, user));
}
else
{
classResource = target.GetComponent<ClassResource>();
classResource.photonView.RPC(nameof(classResource.RPC_ChangeValueClassResource), classResource.photonView.Owner, GetCorrectValueSign(user, target));
}
}
else
{
targetHealth = target.GetComponent<Health>();
if (targetHealth != null)
targetHealth.photonView.RPC(nameof(targetHealth.RPC_ChangeValueHealth), targetHealth.photonView.Owner, GetCorrectValueSign(user, target), (int)damageType);
//targetHealth.ChangeValue(target.targetTag == TargettingTag.Enemy ? -value : value);
}
}
}
private float GetCorrectValueSign(Taggable user, Taggable target)
{
if (user == null) return 0;
if (target == null) return 0;
stats = user.GetComponent<CharacterStats>();
damageOutputModifier = user.GetComponent<DamageOutputModifierEffectInstance>();
GetFinalValue(stats, damageOutputModifier);
//return user.targetTag.AlliedTags.Contains(target.targetTag) ? (finalValue * AlliedTargetMultiplier) : (-finalValue * EnemyTargetMultiplier);
return user.AlliedTagsContains(target.targetTag) ? (finalValue * AlliedTargetMultiplier) : (-finalValue * EnemyTargetMultiplier);
}
/*
private CharacterStat GetCorrectStat(CharacterStats stats) //TODO: make it use multiple stats correctly
{
for (int i = 0; i < influencingStats.Count; i++)
{
if (stats.statsDictionary.ContainsKey(influencingStats[i].statTag.name.ToLower()))
{
Debug.Log($"Influencing effect using: {influencingStats[i].statTag.name.ToLower()}");
return stats.statsDictionary[influencingStats[i].statTag.name.ToLower()];
}
}
return null;
}
*/
private void GetFinalValue(CharacterStats stats, DamageOutputModifierEffectInstance damageOutputModifier)
{
finalValue = baseValue;
if (stats != null)
{
foreach (var statInfluence in influencingStats)
{
if (stats.primaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat stat))
{
finalValue += stat.Value * statInfluence.percentInfluence;
}
else if(stats.secondaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat secondaryStat))
{
finalValue += secondaryStat.Value * statInfluence.percentInfluence;
}
if (statInfluence.statTag.name.ToLower().Contains("Attack")) damageType = DamageType.Attack;
else if (statInfluence.statTag.name.ToLower().Contains("Spell")) damageType = DamageType.Spell;
}
}
//Debug.Log("FinalValue = " + finalValue + " dmgType = " + damageType);
if (IsCrit(stats) && !applyToClassResourceInstead)
{
finalValue *= (1 + stats.CritDamage.Value / 100f);
//Debug.Log("FinalValue IsCrit = " + finalValue + " dmgType = " + damageType);
}
finalValue = damageOutputModifier.ModifyDamageOutput(finalValue);
}
private bool IsCrit(CharacterStats stats)
{
return Random.Range(0, 100) < stats.CritChance.Value;
}
}