Basic sigil system implementation
This commit is contained in:
@@ -5,6 +5,7 @@ using Godot;
|
||||
using SimpleInjector;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Zennysoft.Ma;
|
||||
using Zennysoft.Ma.Adapter;
|
||||
using Zennysoft.Ma.Adapter.Entity;
|
||||
|
||||
@@ -39,6 +40,8 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
|
||||
|
||||
public IStatusEffectComponent StatusEffectComponent { get; private set; }
|
||||
|
||||
public ISigilComponent SigilComponent { get; set; }
|
||||
|
||||
public Vector3 CurrentPosition => GlobalPosition;
|
||||
|
||||
public Basis CurrentBasis => Transform.Basis;
|
||||
@@ -167,6 +170,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
|
||||
LuckComponent = new LuckComponent(InitialLuck);
|
||||
EquipmentComponent = new EquipmentComponent();
|
||||
StatusEffectComponent = new StatusEffectComponent(RustDuration);
|
||||
SigilComponent = new SigilComponent();
|
||||
|
||||
_itemReroller = new ItemReroller(ItemDatabase.Instance);
|
||||
_playerEffectService = new PlayerEffectService(this);
|
||||
@@ -200,6 +204,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
|
||||
ExperiencePointsComponent.Reset();
|
||||
LuckComponent.Reset();
|
||||
EquipmentComponent.Reset();
|
||||
SigilComponent.Reset();
|
||||
|
||||
HealthTimer.Timeout += OnHealthTimerTimeout;
|
||||
}
|
||||
@@ -292,7 +297,8 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
|
||||
|
||||
_camera3D.AddShake(1.0f);
|
||||
TakeDamageAnimationPlayer.Play("take_damage");
|
||||
var damageReceived = DamageCalculator.CalculateDamage(damage, TotalDefense, EquipmentComponent.ElementalResistance);
|
||||
var defense = TotalDefense * SigilComponent.Sigil.DefenseModifier;
|
||||
var damageReceived = DamageCalculator.CalculateDamage(damage, defense, EquipmentComponent.ElementalResistance);
|
||||
HealthComponent.Damage(damageReceived, damage.ElementType);
|
||||
SfxDatabase.Instance.Play(SoundEffect.TakeDamage);
|
||||
|
||||
@@ -303,6 +309,11 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSigil(ISigil sigil)
|
||||
{
|
||||
SigilComponent.Sigil = sigil;
|
||||
}
|
||||
|
||||
public void Knockback(float impulse)
|
||||
{
|
||||
_knockbackStrength = impulse;
|
||||
@@ -899,14 +910,20 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
|
||||
var isCriticalHit = BattleExtensions.IsCriticalHit(TotalLuck);
|
||||
var totalDamage = TotalAttack;
|
||||
|
||||
if (isCriticalHit)
|
||||
if (SigilComponent.Sigil.ElementType == weapon.WeaponElement)
|
||||
totalDamage = Mathf.RoundToInt(totalDamage * 1.15f);
|
||||
|
||||
totalDamage = Mathf.RoundToInt(totalDamage * SigilComponent.Sigil.AttackModifier);
|
||||
|
||||
if (isCriticalHit)
|
||||
{
|
||||
totalDamage += (int)(totalDamage * 0.5f);
|
||||
SfxDatabase.Instance.Play(SoundEffect.Crit);
|
||||
}
|
||||
|
||||
var baseAttack = new AttackData(totalDamage, weapon.WeaponElement, weapon.WeaponTag == WeaponTag.IgnoreDefense, weapon.WeaponTag == WeaponTag.IgnoreAffinity);
|
||||
var damageDealt = DamageCalculator.CalculateDamage(baseAttack, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
|
||||
|
||||
var damageDealt = DamageCalculator.CalculateDamage(baseAttack, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
|
||||
enemy.HealthComponent.Damage(damageDealt, weapon.WeaponElement);
|
||||
|
||||
if (weapon.WeaponTag == WeaponTag.Knockback && enemy is IKnockbackable knockbackable)
|
||||
|
||||
Reference in New Issue
Block a user