84 lines
2.6 KiB
C#
84 lines
2.6 KiB
C#
using UnityEngine;
|
|
using BumpCombat.Constants;
|
|
|
|
namespace BumpCombat.Combat
|
|
{
|
|
public static class BumpCombatMath
|
|
{
|
|
public static float FrontThreshold => GameplayConstants.Current.Combat.FrontThreshold;
|
|
public static float BackThreshold => GameplayConstants.Current.Combat.BackThreshold;
|
|
public static float PositionDamageMultiplier =>
|
|
GameplayConstants.Current.Combat.PositionDamageMultiplier;
|
|
public static float BackDamageMultiplier =>
|
|
GameplayConstants.Current.Combat.BackDamageMultiplier;
|
|
|
|
public static HitSide ClassifySide(Vector2 enemyFacing, Vector2 enemyToPlayer)
|
|
{
|
|
float dot = Vector2.Dot(enemyFacing.normalized, enemyToPlayer.normalized);
|
|
if (dot >= FrontThreshold)
|
|
{
|
|
return HitSide.Front;
|
|
}
|
|
|
|
if (dot <= BackThreshold)
|
|
{
|
|
return HitSide.Back;
|
|
}
|
|
|
|
return HitSide.Side;
|
|
}
|
|
|
|
public static float CalculateLateralOffset(
|
|
Vector2 attackDirection,
|
|
Vector2 attackerPosition,
|
|
Vector2 targetPosition)
|
|
{
|
|
if (attackDirection.sqrMagnitude <= 0f)
|
|
{
|
|
return 0f;
|
|
}
|
|
|
|
Vector2 direction = attackDirection.normalized;
|
|
Vector2 perpendicular = new(-direction.y, direction.x);
|
|
return Mathf.Abs(Vector2.Dot(
|
|
targetPosition - attackerPosition,
|
|
perpendicular));
|
|
}
|
|
|
|
public static bool IsOffsetHit(
|
|
HitSide side,
|
|
Vector2 attackDirection,
|
|
Vector2 attackerPosition,
|
|
Vector2 targetPosition,
|
|
float minimumLateralOffset)
|
|
{
|
|
return side == HitSide.Front
|
|
&& CalculateLateralOffset(
|
|
attackDirection,
|
|
attackerPosition,
|
|
targetPosition) >= minimumLateralOffset;
|
|
}
|
|
|
|
public static float ApplySideMultiplier(
|
|
float baseDamage,
|
|
HitSide side,
|
|
bool isOffsetHit = false)
|
|
{
|
|
float multiplier = side == HitSide.Back
|
|
? BackDamageMultiplier
|
|
: side == HitSide.Side || isOffsetHit
|
|
? PositionDamageMultiplier
|
|
: 1f;
|
|
return DamageCalculator.ApplyMultiplier(baseDamage, multiplier);
|
|
}
|
|
|
|
public static bool AppliesPlayerImpactRecoil(
|
|
HitSide side,
|
|
bool isEventEnemy = false)
|
|
{
|
|
return side != HitSide.Back || isEventEnemy;
|
|
}
|
|
|
|
}
|
|
}
|