Implement plasma sword instakill

This commit is contained in:
2026-02-09 23:01:52 -08:00
parent bfaa324e6a
commit aba325ff2b
12 changed files with 273 additions and 219 deletions

View File

@@ -108,6 +108,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
private Vector3 _knockbackDirection = Vector3.Zero;
private ItemReroller _itemReroller;
private PlayerEffectService _playerEffectService;
public void Initialize()
{
@@ -128,6 +129,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
EquipmentComponent = new EquipmentComponent();
_itemReroller = new ItemReroller(ItemDatabase.Instance);
_playerEffectService = new PlayerEffectService(this);
Settings = new PlayerLogic.Settings() { RotationSpeed = RotationSpeed, MoveSpeed = MoveSpeed, Acceleration = Acceleration };
@@ -212,7 +214,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
{
_camera3D.AddShake(1.0f);
TakeDamageAnimationPlayer.Play("take_damage");
var damageReceived = DamageCalculator.CalculateDamage(damage, DefenseComponent.CurrentDefense.Value + EquipmentComponent.BonusDefense, EquipmentComponent.ElementalResistance);
var damageReceived = DamageCalculator.CalculateDamage(damage, TotalDefense, EquipmentComponent.ElementalResistance);
HealthComponent.Damage(damageReceived);
SfxDatabase.Instance.Play(SoundEffect.TakeDamage);
}
@@ -225,6 +227,12 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
public void PlayJumpScareAnimation() => PlayerFXAnimations.Play("jump_scare");
public int TotalAttack => AttackComponent.CurrentAttack.Value + EquipmentComponent.BonusAttack;
public int TotalDefense => DefenseComponent.CurrentDefense.Value + EquipmentComponent.BonusDefense;
public int TotalLuck => LuckComponent.Luck.Value + EquipmentComponent.BonusLuck;
public void LevelUp()
{
ExperiencePointsComponent.LevelUp();
@@ -414,11 +422,9 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
private void HitEnemy(IEnemy enemy)
{
var ignoreElementalResistance = (EquipmentComponent.EquippedWeapon.Value as Weapon).WeaponTag == WeaponTag.IgnoreAffinity;
var ignoreDefense = (EquipmentComponent.EquippedWeapon.Value as Weapon).WeaponTag == WeaponTag.IgnoreDefense;
var isCriticalHit = BattleExtensions.IsCriticalHit(LuckComponent.Luck.Value + EquipmentComponent.BonusLuck);
var totalDamage = AttackComponent.CurrentAttack.Value + EquipmentComponent.BonusAttack;
var element = (EquipmentComponent.EquippedWeapon.Value as Weapon).WeaponElement;
var weapon = EquipmentComponent.EquippedWeapon.Value as Weapon;
var isCriticalHit = BattleExtensions.IsCriticalHit(TotalLuck);
var totalDamage = TotalAttack;
if (isCriticalHit)
{
@@ -426,21 +432,16 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
SfxDatabase.Instance.Play(SoundEffect.Crit);
}
var baseAttack = new AttackData(totalDamage, element, ignoreDefense, ignoreElementalResistance);
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);
enemy.HealthComponent.Damage(damageDealt);
if (((Weapon)EquipmentComponent.EquippedWeapon.Value).WeaponTag == WeaponTag.Knockback && enemy is IKnockbackable knockbackable)
if (weapon.WeaponTag == WeaponTag.Knockback && enemy is IKnockbackable knockbackable)
knockbackable.Knockback(0.3f, -CurrentBasis.Z.Normalized());
if (((Weapon)EquipmentComponent.EquippedWeapon.Value).WeaponTag == WeaponTag.SelfDamage)
HealthComponent.Damage(5);
if (((Weapon)EquipmentComponent.EquippedWeapon.Value).WeaponTag == WeaponTag.Instakill)
{
var rng = new RandomNumberGenerator();
rng.Randomize();
if (rng.Randf() <= LuckComponent.Luck.Value)
enemy.Die();
}
if (weapon.WeaponTag == WeaponTag.SelfDamage)
_playerEffectService.TakeSelfDamage(weapon.Stats.SelfDamage);
if (weapon.WeaponTag == WeaponTag.Instakill)
_playerEffectService.Instakill(enemy);
}
private void CollisionDetector_AreaEntered(Area3D area)