diff --git a/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs b/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs
index 4d24cc4b..796c7aa6 100644
--- a/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs
+++ b/Zennysoft.Game.Ma.Implementation/Player/IPlayer.cs
@@ -46,6 +46,8 @@ public interface IPlayer : IKillable, ICharacterBody3D
public void PlayTestAnimation();
+ public void SetHealthTimerStatus(bool isActive);
+
public event Action PlayerDied;
public delegate InventoryItem RerollItem(InventoryItem item);
diff --git a/Zennysoft.Game.Ma.Implementation/Zennysoft.Ma.Adapter.csproj b/Zennysoft.Game.Ma.Implementation/Zennysoft.Ma.Adapter.csproj
index c7d6820a..426b7f9a 100644
--- a/Zennysoft.Game.Ma.Implementation/Zennysoft.Ma.Adapter.csproj
+++ b/Zennysoft.Game.Ma.Implementation/Zennysoft.Ma.Adapter.csproj
@@ -7,8 +7,11 @@
+
+
+
@@ -28,8 +31,4 @@
-
-
-
-
diff --git a/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs b/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs
index ec88dbf1..60a59b31 100644
--- a/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs
+++ b/Zennysoft.Game.Ma/src/map/dungeon/code/Overworld.cs
@@ -12,34 +12,72 @@ public partial class Overworld : Node3D, IDungeonFloor
[Dependency] protected IGame Game => this.DependOn();
+ [Dependency] protected IPlayer Player => this.DependOn();
+
[Node] public Marker3D PlayerSpawnPoint { get; set; } = default!;
[Node] private Area3D Exit { get; set; } = default!;
[Node] private RescuedItems RescuedItems { get; set; } = default!;
+ [Node] private Area3D RestoreArea { get; set; } = default!;
+
public ImmutableList Rooms => [];
public bool FloorIsLoaded { get; set; }
+ private Timer RestoreTimer { get; set; }
+
public void InitializeDungeon()
{
- Show();
- Exit.AreaEntered += Exit_AreaEntered;
- RescuedItems.SpawnRescuedItems();
- FloorIsLoaded = true;
+ Show();
+ Exit.AreaEntered += Exit_AreaEntered;
+ RescuedItems.SpawnRescuedItems();
+ RestoreArea.AreaEntered += RestoreArea_AreaEntered;
+ RestoreArea.AreaExited += RestoreArea_AreaExited;
+ RestoreTimer = new Timer();
+ RestoreTimer.WaitTime = 0.3f;
+ RestoreTimer.Timeout += RestoreTimer_Timeout;
+ AddChild(RestoreTimer);
+ FloorIsLoaded = true;
+ }
+
+ private void RestoreTimer_Timeout()
+ {
+ if (!Player.HealthComponent.AtFullHealth)
+ Player.HealthComponent.Heal(1);
+ if (!Player.VTComponent.AtFullVT)
+ Player.VTComponent.Restore(1);
+ }
+
+ private void RestoreArea_AreaExited(Area3D area)
+ {
+ if (area.GetOwner() is IPlayer)
+ {
+ RestoreTimer.Stop();
+ Player.SetHealthTimerStatus(true);
+ }
+ }
+
+ private void RestoreArea_AreaEntered(Area3D area)
+ {
+ if (area.GetOwner() is IPlayer)
+ {
+ RestoreTimer.Start();
+ Player.SetHealthTimerStatus(false);
+ }
}
private void Exit_AreaEntered(Area3D area)
{
- if (area.GetOwner() is IPlayer)
- ExitReached();
+ if (area.GetOwner() is IPlayer)
+ ExitReached();
}
public void ExitReached() => Game.FloorExitReached();
public Transform3D GetPlayerSpawnPoint()
{
- return PlayerSpawnPoint.GlobalTransform;
+ return PlayerSpawnPoint.GlobalTransform;
}
}
diff --git a/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn b/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn
index 5aaad942..7e8f0cda 100644
--- a/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn
+++ b/Zennysoft.Game.Ma/src/map/dungeon/floors/Special Floors/Overworld.tscn
@@ -1,10 +1,10 @@
-[gd_scene load_steps=522 format=4 uid="uid://dvnc26rebk6o0"]
+[gd_scene load_steps=523 format=4 uid="uid://dvnc26rebk6o0"]
[ext_resource type="Script" uid="uid://cuhfkyh3d7noa" path="res://src/map/dungeon/code/Overworld.cs" id="1_5hmt3"]
[ext_resource type="Texture2D" uid="uid://co6h8vyi11sl2" path="res://src/map/overworld/Models/Overworld_CLOUD_RINGS_INNER_63.png" id="2_g6b7b"]
-[ext_resource type="AudioStream" uid="uid://ym4ur8a2qxhp" path="res://src/audio/amb/amb_perlin.wav" id="2_wbbo3"]
-[ext_resource type="AudioStream" uid="uid://b7wxddjx3qw5o" path="res://src/audio/amb/amb_white_noise.wav" id="3_c2gp5"]
-[ext_resource type="AudioStream" uid="uid://ddii3pi8x75xc" path="res://src/audio/amb/amb_beach.wav" id="3_pvi8n"]
+[ext_resource type="AudioStream" uid="uid://dqmsaok6fyhe7" path="res://src/audio/amb/amb_perlin.wav" id="2_wbbo3"]
+[ext_resource type="AudioStream" uid="uid://dl07vg00se7hd" path="res://src/audio/amb/amb_white_noise.wav" id="3_c2gp5"]
+[ext_resource type="AudioStream" uid="uid://boypvgaweep8a" path="res://src/audio/amb/amb_beach.wav" id="3_pvi8n"]
[ext_resource type="Texture2D" uid="uid://w33fr6exryiy" path="res://src/map/overworld/Models/Overworld_CLOUD_RINGS_INNER_37.png" id="3_uyygh"]
[ext_resource type="Texture2D" uid="uid://dv10yaqvp3mub" path="res://src/map/overworld/Models/Overworld_CLOUD_RINGS_INNER_71.png" id="4_r8r3k"]
[ext_resource type="Shader" uid="uid://brhf7s3riyag5" path="res://src/map/map shaders/Metal.gdshader" id="5_d1qcb"]
@@ -10008,6 +10008,9 @@ shadow_mesh = SubResource("ArrayMesh_2djfl")
[sub_resource type="BoxShape3D" id="BoxShape3D_b53dq"]
size = Vector3(32.7888, 2.34912, 7.88136)
+[sub_resource type="CylinderShape3D" id="CylinderShape3D_yksd7"]
+radius = 6.19775
+
[node name="Overworld" type="Node3D"]
script = ExtResource("1_5hmt3")
@@ -10728,5 +10731,14 @@ collision_mask = 256
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.28978, -2.1779, 7.74164)
shape = SubResource("BoxShape3D_b53dq")
+[node name="RestoreArea" type="Area3D" parent="."]
+unique_name_in_owner = true
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -293.713, 3.30221, 45.5386)
+collision_layer = 256
+collision_mask = 256
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="RestoreArea"]
+shape = SubResource("CylinderShape3D_yksd7")
+
[editable path="Node3D/Actors/Clalo"]
[editable path="Node3D/Actors/Caretaker of Saints"]
diff --git a/Zennysoft.Game.Ma/src/player/Player.cs b/Zennysoft.Game.Ma/src/player/Player.cs
index e763a40a..0e58960e 100644
--- a/Zennysoft.Game.Ma/src/player/Player.cs
+++ b/Zennysoft.Game.Ma/src/player/Player.cs
@@ -102,7 +102,7 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide
private float _healthTimerWaitTime = 3.0f;
- private bool reduceOnTick = true;
+ private bool _healthTimerActive = true;
private float _knockbackStrength = 0.0f;
private Vector3 _knockbackDirection = Vector3.Zero;
@@ -111,201 +111,201 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide
public void Initialize()
{
- var container = new SimpleInjector.Container();
- container.Register(Lifestyle.Singleton);
+ var container = new SimpleInjector.Container();
+ container.Register(Lifestyle.Singleton);
- PlayerLogic = container.GetInstance();
- PlayerLogic.Set(this as IPlayer);
- PlayerLogic.Set(Settings);
+ PlayerLogic = container.GetInstance();
+ PlayerLogic.Set(this as IPlayer);
+ PlayerLogic.Set(Settings);
- Inventory = new Inventory();
- HealthComponent = new HealthComponent(InitialHP);
- VTComponent = new VTComponent(InitialVT);
- AttackComponent = new AttackComponent(InitialAttack);
- DefenseComponent = new DefenseComponent(InitialDefense);
- ExperiencePointsComponent = new ExperiencePointsComponent();
- LuckComponent = new LuckComponent(InitialLuck);
- EquipmentComponent = new EquipmentComponent();
+ Inventory = new Inventory();
+ HealthComponent = new HealthComponent(InitialHP);
+ VTComponent = new VTComponent(InitialVT);
+ AttackComponent = new AttackComponent(InitialAttack);
+ DefenseComponent = new DefenseComponent(InitialDefense);
+ ExperiencePointsComponent = new ExperiencePointsComponent();
+ LuckComponent = new LuckComponent(InitialLuck);
+ EquipmentComponent = new EquipmentComponent();
- _itemReroller = new ItemReroller(ItemDatabase.Instance);
+ _itemReroller = new ItemReroller(ItemDatabase.Instance);
- CameraAnimations.AnimationFinished += CameraAnimations_AnimationFinished;
+ CameraAnimations.AnimationFinished += CameraAnimations_AnimationFinished;
- Settings = new PlayerLogic.Settings() { RotationSpeed = RotationSpeed, MoveSpeed = MoveSpeed, Acceleration = Acceleration };
+ Settings = new PlayerLogic.Settings() { RotationSpeed = RotationSpeed, MoveSpeed = MoveSpeed, Acceleration = Acceleration };
- PlayerBinding = PlayerLogic.Bind();
+ PlayerBinding = PlayerLogic.Bind();
- PlayerBinding
- .Handle((in PlayerLogic.Output.ThrowItem output) =>
- {
- })
- .Handle((in PlayerLogic.Output.Move output) =>
- {
- Move(output.delta);
- });
+ PlayerBinding
+ .Handle((in PlayerLogic.Output.ThrowItem output) =>
+ {
+ })
+ .Handle((in PlayerLogic.Output.Move output) =>
+ {
+ Move(output.delta);
+ });
- PlayerLogic.Start();
- this.Provide();
+ PlayerLogic.Start();
+ this.Provide();
}
public void ResetPlayerData()
{
- foreach (var item in Inventory.Items)
- Inventory.Remove(item);
+ foreach (var item in Inventory.Items)
+ Inventory.Remove(item);
- HealthComponent.Reset();
- VTComponent.Reset();
- AttackComponent.Reset();
- DefenseComponent.Reset();
- ExperiencePointsComponent.Reset();
- LuckComponent.Reset();
- EquipmentComponent.Reset();
+ HealthComponent.Reset();
+ VTComponent.Reset();
+ AttackComponent.Reset();
+ DefenseComponent.Reset();
+ ExperiencePointsComponent.Reset();
+ LuckComponent.Reset();
+ EquipmentComponent.Reset();
- HealthTimer.Timeout += OnHealthTimerTimeout;
+ HealthTimer.Timeout += OnHealthTimerTimeout;
}
#region Initialization
public void OnReady()
{
- Hitbox.AreaEntered += Hitbox_AreaEntered;
- CollisionDetector.AreaEntered += CollisionDetector_AreaEntered;
- HealthComponent.HealthReachedZero += Die;
- HealthTimer.WaitTime = _healthTimerWaitTime;
- SetProcessInput(false);
- SetPhysicsProcess(false);
+ Hitbox.AreaEntered += Hitbox_AreaEntered;
+ CollisionDetector.AreaEntered += CollisionDetector_AreaEntered;
+ HealthComponent.HealthReachedZero += Die;
+ HealthTimer.WaitTime = _healthTimerWaitTime;
+ SetProcessInput(false);
+ SetPhysicsProcess(false);
}
#endregion
public void Activate()
{
- SetProcessInput(true);
- SetPhysicsProcess(true);
- SetHealthTimerStatus(HealthTimerIsActive);
+ SetProcessInput(true);
+ SetPhysicsProcess(true);
+ SetHealthTimerStatus(HealthTimerIsActive);
}
public void Deactivate()
{
- Velocity = Vector3.Zero;
- SetProcessInput(false);
- SetPhysicsProcess(false);
- SetHealthTimerStatus(false);
+ Velocity = Vector3.Zero;
+ SetProcessInput(false);
+ SetPhysicsProcess(false);
+ SetHealthTimerStatus(false);
}
public void LookUp() => CameraAnimations.Play("look_up");
- private void SetHealthTimerStatus(bool isActive)
+ public void SetHealthTimerStatus(bool isActive)
{
- if (isActive)
- HealthTimer.Start();
- else
- HealthTimer.Stop();
+ if (isActive)
+ HealthTimer.Start();
+ else
+ HealthTimer.Stop();
}
public void TeleportPlayer(Transform3D newTransform)
{
- Transform = newTransform;
+ Transform = newTransform;
}
public void TakeDamage(AttackData damage)
{
- _camera3D.AddShake(1.0f);
- TakeDamageAnimationPlayer.Play("take_damage");
- var damageReceived = DamageCalculator.CalculateDamage(damage, DefenseComponent.CurrentDefense.Value + EquipmentComponent.BonusDefense, EquipmentComponent.ElementalResistance);
- HealthComponent.Damage(damageReceived);
- SfxDatabase.Instance.Play(SoundEffect.TakeDamage);
+ _camera3D.AddShake(1.0f);
+ TakeDamageAnimationPlayer.Play("take_damage");
+ var damageReceived = DamageCalculator.CalculateDamage(damage, DefenseComponent.CurrentDefense.Value + EquipmentComponent.BonusDefense, EquipmentComponent.ElementalResistance);
+ HealthComponent.Damage(damageReceived);
+ SfxDatabase.Instance.Play(SoundEffect.TakeDamage);
}
public void Knockback(float impulse)
{
- _knockbackStrength = impulse;
- _knockbackDirection = GlobalBasis.Z.Normalized();
+ _knockbackStrength = impulse;
+ _knockbackDirection = GlobalBasis.Z.Normalized();
}
public void LevelUp()
{
- var rng = new RandomNumberGenerator();
- rng.Randomize();
- var hpIncrease = rng.RandiRange(3, 6);
- HealthComponent.RaiseMaximumHP(hpIncrease);
- ExperiencePointsComponent.LevelUp();
+ var rng = new RandomNumberGenerator();
+ rng.Randomize();
+ var hpIncrease = rng.RandiRange(3, 6);
+ HealthComponent.RaiseMaximumHP(hpIncrease);
+ ExperiencePointsComponent.LevelUp();
}
public void Die()
{
- PlayerFXAnimations.Play("death");
- HealthTimer.WaitTime = _healthTimerWaitTime;
- HealthTimer.Timeout -= OnHealthTimerTimeout;
- SetProcessInput(false);
- SetPhysicsProcess(false);
- PlayerDied?.Invoke();
+ PlayerFXAnimations.Play("death");
+ HealthTimer.WaitTime = _healthTimerWaitTime;
+ HealthTimer.Timeout -= OnHealthTimerTimeout;
+ SetProcessInput(false);
+ SetPhysicsProcess(false);
+ PlayerDied?.Invoke();
}
public void Reset()
{
- CameraAnimations.Play("RESET");
+ CameraAnimations.Play("RESET");
}
public override void _Input(InputEvent @event)
{
- if (@event.IsActionPressed(GameInputs.Attack))
- Attack();
- if (@event.IsActionPressed(GameInputs.Sprint))
- Settings.MoveSpeed *= 2;
- if (@event.IsActionReleased(GameInputs.Sprint))
- Settings.MoveSpeed /= 2;
+ if (@event.IsActionPressed(GameInputs.Attack))
+ Attack();
+ if (@event.IsActionPressed(GameInputs.Sprint))
+ Settings.MoveSpeed *= 2;
+ if (@event.IsActionReleased(GameInputs.Sprint))
+ Settings.MoveSpeed /= 2;
}
public void PlayTestAnimation()
{
- PlayerFXAnimations.Play("test_animation");
+ PlayerFXAnimations.Play("test_animation");
}
public void OnPhysicsProcess(double delta)
{
- PlayerLogic.Input(new PlayerLogic.Input.PhysicsTick(delta));
- PlayerLogic.Input(new PlayerLogic.Input.Moved(GlobalPosition, GlobalTransform));
+ PlayerLogic.Input(new PlayerLogic.Input.PhysicsTick(delta));
+ PlayerLogic.Input(new PlayerLogic.Input.Moved(GlobalPosition, GlobalTransform));
}
public void Equip(EquipableItem equipable)
{
- if (equipable.ItemTag == ItemTag.MysteryItem)
- {
- var rerolledItem = _itemReroller.RerollItem(equipable, Inventory);
- Equip(rerolledItem);
- return;
- }
+ if (equipable.ItemTag == ItemTag.MysteryItem)
+ {
+ var rerolledItem = _itemReroller.RerollItem(equipable, Inventory);
+ Equip(rerolledItem);
+ return;
+ }
- HealthComponent.RaiseMaximumHP(equipable.BonusHP, false);
- VTComponent.RaiseMaximumVT(equipable.BonusVT, false);
+ HealthComponent.RaiseMaximumHP(equipable.BonusHP, false);
+ VTComponent.RaiseMaximumVT(equipable.BonusVT, false);
- EquipmentComponent.Equip(equipable);
+ EquipmentComponent.Equip(equipable);
}
public void Unequip(EquipableItem equipable)
{
- HealthComponent.SetMaximumHealth(HealthComponent.MaximumHP.Value - equipable.BonusHP);
- VTComponent.SetMaximumVT(VTComponent.MaximumVT.Value - equipable.BonusVT);
+ HealthComponent.SetMaximumHealth(HealthComponent.MaximumHP.Value - equipable.BonusHP);
+ VTComponent.SetMaximumVT(VTComponent.MaximumVT.Value - equipable.BonusVT);
- EquipmentComponent.Unequip(equipable);
+ EquipmentComponent.Unequip(equipable);
}
private void CameraAnimations_AnimationFinished(StringName animName)
{
- PointUpFinished?.Invoke();
+ PointUpFinished?.Invoke();
}
private static Vector3 GlobalInputVector
{
- get
- {
- var rawInput = Input.GetVector(GameInputs.MoveLeft, GameInputs.MoveRight, GameInputs.MoveUp, GameInputs.MoveDown);
- var input = new Vector3
- {
- X = rawInput.X,
- Z = rawInput.Y
- };
- return input with { Y = 0f };
- }
+ get
+ {
+ var rawInput = Input.GetVector(GameInputs.MoveLeft, GameInputs.MoveRight, GameInputs.MoveUp, GameInputs.MoveDown);
+ var input = new Vector3
+ {
+ X = rawInput.X,
+ Z = rawInput.Y
+ };
+ return input with { Y = 0f };
+ }
}
private static float LeftStrafeInputVector => Input.GetActionStrength(GameInputs.StrafeLeft);
@@ -314,143 +314,143 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide
private void Attack()
{
- if (PlayerIsHittingGeometry())
- AnimationPlayer.Play("hit_wall");
- else if (!AnimationPlayer.IsPlaying())
- PlayAttackAnimation();
+ if (PlayerIsHittingGeometry())
+ AnimationPlayer.Play("hit_wall");
+ else if (!AnimationPlayer.IsPlaying())
+ PlayAttackAnimation();
}
private void ThrowItem()
{
- var itemScene = GD.Load("res://src/items/throwable/ThrowableItem.tscn");
- var throwItem = itemScene.Instantiate();
- GetTree().Root.AddChildEx(throwItem);
- throwItem.GlobalPosition = CurrentPosition + new Vector3(0, 3.5f, 0);
- throwItem.GlobalRotation = GlobalRotation;
+ var itemScene = GD.Load("res://src/items/throwable/ThrowableItem.tscn");
+ var throwItem = itemScene.Instantiate();
+ GetTree().Root.AddChildEx(throwItem);
+ throwItem.GlobalPosition = CurrentPosition + new Vector3(0, 3.5f, 0);
+ throwItem.GlobalRotation = GlobalRotation;
}
private void PlayAttackAnimation()
{
- SfxDatabase.Instance.Play(((Weapon)EquipmentComponent.EquippedWeapon.Value).SoundEffect);
- var attackSpeed = ((Weapon)EquipmentComponent.EquippedWeapon.Value).AttackSpeed;
- AnimationPlayer.SetSpeedScale((float)attackSpeed);
- AnimationPlayer.Play("attack");
+ SfxDatabase.Instance.Play(((Weapon)EquipmentComponent.EquippedWeapon.Value).SoundEffect);
+ var attackSpeed = ((Weapon)EquipmentComponent.EquippedWeapon.Value).AttackSpeed;
+ AnimationPlayer.SetSpeedScale((float)attackSpeed);
+ AnimationPlayer.Play("attack");
}
private void OnExitTree()
{
- PlayerLogic.Stop();
- PlayerBinding.Dispose();
- Hitbox.AreaEntered -= Hitbox_AreaEntered;
- CollisionDetector.AreaEntered -= CollisionDetector_AreaEntered;
- HealthComponent.HealthReachedZero -= Die;
- HealthTimer.Timeout -= OnHealthTimerTimeout;
+ PlayerLogic.Stop();
+ PlayerBinding.Dispose();
+ Hitbox.AreaEntered -= Hitbox_AreaEntered;
+ CollisionDetector.AreaEntered -= CollisionDetector_AreaEntered;
+ HealthComponent.HealthReachedZero -= Die;
+ HealthTimer.Timeout -= OnHealthTimerTimeout;
}
private void Move(float delta)
{
- var rawInput = GlobalInputVector;
- var strafeLeftInput = LeftStrafeInputVector;
- var strafeRightInput = RightStrafeInputVector;
+ var rawInput = GlobalInputVector;
+ var strafeLeftInput = LeftStrafeInputVector;
+ var strafeRightInput = RightStrafeInputVector;
- var transform = Transform;
- transform.Basis = new Basis(Vector3.Up, Settings.RotationSpeed * -rawInput.X * delta) * transform.Basis;
- var moveDirection = new Vector3(strafeRightInput - strafeLeftInput, 0, rawInput.Z).Normalized();
- var velocity = Basis * moveDirection * Settings.MoveSpeed * Settings.Acceleration;
- _knockbackStrength *= 0.9f;
- Transform = Transform with { Basis = transform.Basis };
- Velocity = velocity + (_knockbackDirection * _knockbackStrength);
- if (!WalkSFX.Playing && !Velocity.IsZeroApprox())
- WalkSFX.Play();
- else if (Velocity.IsZeroApprox())
- WalkSFX.Stop();
- MoveAndSlide();
+ var transform = Transform;
+ transform.Basis = new Basis(Vector3.Up, Settings.RotationSpeed * -rawInput.X * delta) * transform.Basis;
+ var moveDirection = new Vector3(strafeRightInput - strafeLeftInput, 0, rawInput.Z).Normalized();
+ var velocity = Basis * moveDirection * Settings.MoveSpeed * Settings.Acceleration;
+ _knockbackStrength *= 0.9f;
+ Transform = Transform with { Basis = transform.Basis };
+ Velocity = velocity + (_knockbackDirection * _knockbackStrength);
+ if (!WalkSFX.Playing && !Velocity.IsZeroApprox())
+ WalkSFX.Play();
+ else if (Velocity.IsZeroApprox())
+ WalkSFX.Stop();
+ MoveAndSlide();
}
private void OnPlayerPositionUpdated(Vector3 globalPosition) => GlobalPosition = globalPosition;
private void OnHealthTimerTimeout()
{
- if (VTComponent.CurrentVT.Value > 0)
- {
- if (((Accessory)EquipmentComponent.EquippedAccessory.Value).AccessoryTag == AccessoryTag.HalfVTConsumption)
- reduceOnTick = !reduceOnTick;
+ if (VTComponent.CurrentVT.Value > 0)
+ {
+ if (((Accessory)EquipmentComponent.EquippedAccessory.Value).AccessoryTag == AccessoryTag.HalfVTConsumption)
+ _healthTimerActive = !_healthTimerActive;
- HealthComponent.Heal(1);
+ HealthComponent.Heal(1);
- if (reduceOnTick)
- VTComponent.Reduce(1);
- }
- else
- HealthComponent.Damage(1);
+ if (_healthTimerActive)
+ VTComponent.Reduce(1);
+ }
+ else
+ HealthComponent.Damage(1);
}
private void Hitbox_AreaEntered(Area3D area)
{
- var target = area.GetOwner();
- if (target is IEnemy enemy)
- HitEnemy(enemy);
+ var target = area.GetOwner();
+ if (target is IEnemy enemy)
+ HitEnemy(enemy);
}
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 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;
- if (isCriticalHit)
- {
- totalDamage += (int)(totalDamage * 0.5f);
- SfxDatabase.Instance.Play(SoundEffect.Crit);
- }
+ if (isCriticalHit)
+ {
+ totalDamage += (int)(totalDamage * 0.5f);
+ SfxDatabase.Instance.Play(SoundEffect.Crit);
+ }
- var baseAttack = new AttackData(totalDamage, element, ignoreDefense, ignoreElementalResistance);
- var damageDealt = DamageCalculator.CalculateDamage(baseAttack, enemy.DefenseComponent.CurrentDefense.Value, ElementalResistanceSet.None);
- enemy.HealthComponent.Damage(damageDealt);
+ var baseAttack = new AttackData(totalDamage, element, ignoreDefense, ignoreElementalResistance);
+ var damageDealt = DamageCalculator.CalculateDamage(baseAttack, enemy.DefenseComponent.CurrentDefense.Value, ElementalResistanceSet.None);
+ enemy.HealthComponent.Damage(damageDealt);
- if (((Weapon)EquipmentComponent.EquippedWeapon.Value).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.Knockback && enemy is IKnockbackable knockbackable)
+ knockbackable.Knockback(0.3f, -CurrentBasis.Z.Normalized());
+ if (((Weapon)EquipmentComponent.EquippedWeapon.Value).WeaponTag == WeaponTag.SelfDamage)
+ HealthComponent.Damage(5);
}
private void CollisionDetector_AreaEntered(Area3D area)
{
- if (area.GetParent() is InventoryItem inventoryItem)
- {
- var isAdded = Inventory.PickUpItem(inventoryItem);
- if (isAdded)
- inventoryItem.QueueFree();
- }
- if (area.GetParent() is DroppedItem droppedItem)
- {
- var isAdded = Inventory.PickUpItem(droppedItem.Item);
- if (isAdded)
- droppedItem.QueueFree();
- }
- if (area.GetParent() is ThrownItem thrownItem)
- {
- var isAdded = Inventory.PickUpItem(thrownItem.ItemThatIsThrown);
- if (isAdded)
- thrownItem.QueueFree();
- }
- if (area.GetParent() is Restorative restorative)
- {
- restorative.QueueFree();
- }
+ if (area.GetParent() is InventoryItem inventoryItem)
+ {
+ var isAdded = Inventory.PickUpItem(inventoryItem);
+ if (isAdded)
+ inventoryItem.QueueFree();
+ }
+ if (area.GetParent() is DroppedItem droppedItem)
+ {
+ var isAdded = Inventory.PickUpItem(droppedItem.Item);
+ if (isAdded)
+ droppedItem.QueueFree();
+ }
+ if (area.GetParent() is ThrownItem thrownItem)
+ {
+ var isAdded = Inventory.PickUpItem(thrownItem.ItemThatIsThrown);
+ if (isAdded)
+ thrownItem.QueueFree();
+ }
+ if (area.GetParent() is Restorative restorative)
+ {
+ restorative.QueueFree();
+ }
}
private bool PlayerIsHittingGeometry()
{
- var collisions = WallCheck.GetCollidingBodies();
- return collisions.Count > 0;
+ var collisions = WallCheck.GetCollidingBodies();
+ return collisions.Count > 0;
}
private void WallCheck_BodyEntered(Node body)
{
- GD.Print("Hit wall");
- AnimationPlayer.Stop();
+ GD.Print("Hit wall");
+ AnimationPlayer.Stop();
}
}