Basic sigil system implementation

This commit is contained in:
2026-05-02 00:35:49 -07:00
parent 9e7678ce2a
commit 4460fd28f5
13 changed files with 215 additions and 45 deletions
+20 -3
View File
@@ -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)