Add elemental VFX when hitting enemies (2D only currently)

This commit is contained in:
2026-04-23 01:04:02 -07:00
parent 65a78f9871
commit 89da483448
46 changed files with 46974 additions and 755 deletions

View File

@@ -9,13 +9,13 @@ public interface IHealthComponent : IEntityComponent
public IAutoProp<int> MaximumHP { get; } public IAutoProp<int> MaximumHP { get; }
public event Action? HealthReachedZero; public event Action? HealthReachedZero;
public event Action? DamageTaken; public event Action<ElementType>? DamageTaken;
public bool AtFullHealth { get; } public bool AtFullHealth { get; }
public void Heal(int healAmount); public void Heal(int healAmount);
public void Damage(int damageAmount); public void Damage(int damageAmount, ElementType elementType);
public void SetCurrentHealth(int health); public void SetCurrentHealth(int health);

View File

@@ -16,7 +16,7 @@ public class HealthComponent : IHealthComponent
private readonly AutoProp<int> _maximumHP; private readonly AutoProp<int> _maximumHP;
public event Action? HealthReachedZero; public event Action? HealthReachedZero;
public event Action? DamageTaken; public event Action<ElementType>? DamageTaken;
public bool AtFullHealth => CurrentHP.Value == MaximumHP.Value; public bool AtFullHealth => CurrentHP.Value == MaximumHP.Value;
@@ -44,7 +44,7 @@ public class HealthComponent : IHealthComponent
_currentHP.OnNext(cappedAmount); _currentHP.OnNext(cappedAmount);
} }
public void Damage(int damageAmount) public void Damage(int damageAmount, ElementType elementType)
{ {
if (CurrentHP.Value <= 0) if (CurrentHP.Value <= 0)
return; return;
@@ -55,7 +55,7 @@ public class HealthComponent : IHealthComponent
if (cappedAmount == 0) if (cappedAmount == 0)
HealthReachedZero?.Invoke(); HealthReachedZero?.Invoke();
else else
DamageTaken?.Invoke(); DamageTaken?.Invoke(elementType);
} }
public void SetCurrentHealth(int health) public void SetCurrentHealth(int health)

View File

@@ -3,12 +3,12 @@
importer="oggvorbisstr" importer="oggvorbisstr"
type="AudioStreamOggVorbis" type="AudioStreamOggVorbis"
uid="uid://cgk17d8erskht" uid="uid://cgk17d8erskht"
path="res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr" path="res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"
[deps] [deps]
source_file="res://src/audio/amb/amb_ocean.ogg" source_file="res://src/audio/AMB/amb_ocean.ogg"
dest_files=["res://.godot/imported/amb_ocean.ogg-01a11020be2db82b0e22d1423cb26aa3.oggvorbisstr"] dest_files=["res://.godot/imported/amb_ocean.ogg-f4ee3d30caf9194f7881a02c6507d38a.oggvorbisstr"]
[params] [params]

View File

@@ -169,8 +169,9 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
} }
public virtual void TakeHit() public virtual void TakeHit(ElementType damageElementType)
{ {
EnemyModelView.PlayElementalDamageAnimation(damageElementType);
_enemyLogic.Input(new EnemyLogic.Input.Alert()); _enemyLogic.Input(new EnemyLogic.Input.Alert());
EnemyModelView.PlayHitAnimation(); EnemyModelView.PlayHitAnimation();
_hitSFX.Play(); _hitSFX.Play();
@@ -281,8 +282,8 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
private void _rustTimer_Timeout() private void _rustTimer_Timeout()
{ {
HealthComponent.Damage(3); HealthComponent.Damage(3, ElementType.Ferrum);
TakeHit(); TakeHit(ElementType.Ferrum);
} }
private void _rustDuration_Timeout() private void _rustDuration_Timeout()

View File

@@ -134,4 +134,6 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView
AnimationTree.Get(_parametersPlayback).As<AnimationNodeStateMachinePlayback>().Stop(); AnimationTree.Get(_parametersPlayback).As<AnimationNodeStateMachinePlayback>().Stop();
AnimationTree.AnimationFinished -= AnimationTree_AnimationFinished; AnimationTree.AnimationFinished -= AnimationTree_AnimationFinished;
} }
public abstract void PlayElementalDamageAnimation(ElementType elementType);
} }

View File

@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq; using System.Linq;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))] [Meta(typeof(IAutoNode))]
@@ -17,6 +18,15 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
[Node] public AnimationPlayer AnimationPlayer { get; set; } = default!; [Node] public AnimationPlayer AnimationPlayer { get; set; } = default!;
[Node] public AnimationPlayer FlameHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer RustHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer HolyHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer WindHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer WaterHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer CurseHitAnimation { get; set; } = default!;
[Node] public AnimationPlayer EarthHitAnimation { get; set; } = default!;
[ExportGroup("Enemy Model Properties")] [ExportGroup("Enemy Model Properties")]
[Export(PropertyHint.Range, "0.0, 1.0")] [Export(PropertyHint.Range, "0.0, 1.0")]
private float _upperThreshold { get; set; } = 0.5f; private float _upperThreshold { get; set; } = 0.5f;
@@ -56,6 +66,47 @@ public partial class EnemyModelView2D : EnemyModelView, IEnemyModelView
tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f); tweener.TweenMethod(Callable.From((float x) => SetShaderValue(x)), 0.0f, 0.1f, 0.8f);
} }
public override void PlayElementalDamageAnimation(ElementType elementType)
{
if (elementType == ElementType.Igneous)
{
if (FlameHitAnimation.IsPlaying())
FlameHitAnimation.Stop();
FlameHitAnimation.Play("FireHit");
}
else if (elementType == ElementType.Holy)
{
if (HolyHitAnimation.IsPlaying())
HolyHitAnimation.Stop();
HolyHitAnimation.Play("HolyHit");
}
else if (elementType == ElementType.Aeolic)
{
if (WindHitAnimation.IsPlaying())
WindHitAnimation.Stop();
WindHitAnimation.Play("WindHit");
}
else if (elementType == ElementType.Curse)
{
if (CurseHitAnimation.IsPlaying())
CurseHitAnimation.Stop();
CurseHitAnimation.Play("CurseHit");
}
else if (elementType == ElementType.Hydric)
{
if (WaterHitAnimation.IsPlaying())
WaterHitAnimation.Stop();
WaterHitAnimation.Play("WaterHit");
}
else if (elementType == ElementType.Telluric)
{
if (EarthHitAnimation.IsPlaying())
EarthHitAnimation.Stop();
EarthHitAnimation.Play("EarthHit");
}
}
private EnemyDirection GetEnemyDirection( private EnemyDirection GetEnemyDirection(
Basis enemyBasis, Basis enemyBasis,
Vector3 cameraDirection, Vector3 cameraDirection,

View File

@@ -1,6 +1,7 @@
using Chickensoft.AutoInject; using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -59,4 +60,9 @@ public partial class EnemyModelView3D : EnemyModelView
{ {
MeshInstance.Transparency = transparencyAmount; MeshInstance.Transparency = transparencyAmount;
} }
public override void PlayElementalDamageAnimation(ElementType elementType)
{
}
} }

View File

@@ -27,6 +27,8 @@ public interface IEnemyModelView : INode3D
public void PlayDeathAnimation(); public void PlayDeathAnimation();
public void PlayElementalDamageAnimation(ElementType elementType);
public double ViewerSize { get; } public double ViewerSize { get; }
public AttackData AttackData { get; set; } public AttackData AttackData { get; set; }

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=621 format=3 uid="uid://g84hcmgo3gtl"] [gd_scene load_steps=627 format=3 uid="uid://g84hcmgo3gtl"]
[ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_oh25a"] [ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_oh25a"]
[ext_resource type="Texture2D" uid="uid://nps7rrvkgews" path="res://src/enemy/enemy_types/04. sara/animations/IDLE+MOVE/FRONT/0001.png" id="2_8j76g"] [ext_resource type="Texture2D" uid="uid://nps7rrvkgews" path="res://src/enemy/enemy_types/04. sara/animations/IDLE+MOVE/FRONT/0001.png" id="2_8j76g"]
@@ -1442,6 +1442,9 @@ region = Rect2(3072, 512, 512, 512)
animations = [{ animations = [{
"frames": [{ "frames": [{
"duration": 1.0, "duration": 1.0,
"texture": null
}, {
"duration": 1.0,
"texture": SubResource("AtlasTexture_slhg2") "texture": SubResource("AtlasTexture_slhg2")
}, { }, {
"duration": 1.0, "duration": 1.0,
@@ -4507,13 +4510,69 @@ _data = {
&"RESET": SubResource("Animation_8wlnr") &"RESET": SubResource("Animation_8wlnr")
} }
[sub_resource type="Animation" id="Animation_6shfu"] [sub_resource type="Animation" id="Animation_30xy4"]
resource_name = "Fire Damage" resource_name = "CurseHit"
length = 1.33334 length = 1.56667
tracks/0/type = "value" tracks/0/type = "value"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:animation") tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.56667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 47]
}
[sub_resource type="Animation" id="Animation_3pm1j"]
resource_name = "EarthHit"
length = 1.46667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"EARTH DAMAGE"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.46667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 44]
}
[sub_resource type="Animation" id="Animation_6shfu"]
resource_name = "Fire Damage"
length = 2.93334
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:animation")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@@ -4525,7 +4584,7 @@ tracks/0/keys = {
tracks/1/type = "value" tracks/1/type = "value"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:frame") tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:frame")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@@ -4537,7 +4596,7 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:modulate") tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:modulate")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@@ -4546,13 +4605,65 @@ tracks/2/keys = {
"update": 0, "update": 0,
"values": [Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056)] "values": [Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056), Color(1, 1, 1, 0.85), Color(1, 1, 1, 0.056)]
} }
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:animation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 2.93333),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [88, 88]
}
[sub_resource type="Animation" id="Animation_f5cjs"]
resource_name = "HolyHit"
length = 0.700003
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"HOLY"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.7),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 21]
}
[sub_resource type="Animation" id="Animation_cftgd"] [sub_resource type="Animation" id="Animation_cftgd"]
length = 0.001 length = 0.001
tracks/0/type = "value" tracks/0/type = "value"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:modulate") tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:modulate")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@@ -4564,7 +4675,7 @@ tracks/0/keys = {
tracks/1/type = "value" tracks/1/type = "value"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:frame") tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:frame")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@@ -4576,7 +4687,7 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/Flame Hit Effect:animation") tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Flame Hit Effect:animation")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@@ -4585,11 +4696,295 @@ tracks/2/keys = {
"update": 1, "update": 1,
"values": [&"Flame Damage"] "values": [&"Flame Damage"]
} }
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:animation")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [88]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:animation")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"HOLY"]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Holy Hit Layer Effect:frame")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:animation")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:frame")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [50]
}
tracks/9/type = "value"
tracks/9/imported = false
tracks/9/enabled = true
tracks/9/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:animation")
tracks/9/interp = 1
tracks/9/loop_wrap = true
tracks/9/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
}
tracks/10/type = "value"
tracks/10/imported = false
tracks/10/enabled = true
tracks/10/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:frame")
tracks/10/interp = 1
tracks/10/loop_wrap = true
tracks/10/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [29]
}
tracks/11/type = "value"
tracks/11/imported = false
tracks/11/enabled = true
tracks/11/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:animation")
tracks/11/interp = 1
tracks/11/loop_wrap = true
tracks/11/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER"]
}
tracks/12/type = "value"
tracks/12/imported = false
tracks/12/enabled = true
tracks/12/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:frame")
tracks/12/interp = 1
tracks/12/loop_wrap = true
tracks/12/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [51]
}
tracks/13/type = "value"
tracks/13/imported = false
tracks/13/enabled = true
tracks/13/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:animation")
tracks/13/interp = 1
tracks/13/loop_wrap = true
tracks/13/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/14/type = "value"
tracks/14/imported = false
tracks/14/enabled = true
tracks/14/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Curse Hit Effect:frame")
tracks/14/interp = 1
tracks/14/loop_wrap = true
tracks/14/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [47]
}
tracks/15/type = "value"
tracks/15/imported = false
tracks/15/enabled = true
tracks/15/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:animation")
tracks/15/interp = 1
tracks/15/loop_wrap = true
tracks/15/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
}
tracks/16/type = "value"
tracks/16/imported = false
tracks/16/enabled = true
tracks/16/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Earth Hit Effect:frame")
tracks/16/interp = 1
tracks/16/loop_wrap = true
tracks/16/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_0tqwp"]
resource_name = "RustActivate"
length = 1.46667
step = 0.0166667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Rust Activation Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1.46667),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 88]
}
[sub_resource type="Animation" id="Animation_q5dfb"]
resource_name = "WaterHit"
length = 1.7
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER DAMAGE"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 1 Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 1),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 29]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:animation")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"WATER"]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Water Hit Layer 2Effect:frame")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 1.7),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 51]
}
[sub_resource type="Animation" id="Animation_godpv"]
resource_name = "WindHit"
length = 0.833335
step = 0.0166667
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:animation")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [&"default"]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("../Sprite3D/SubViewportContainer/SubViewport/VFXSprites/Wind Hit Layer Effect:frame")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0, 0.833333),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0, 50]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_0tqwp"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_0tqwp"]
_data = { _data = {
&"Fire Damage": SubResource("Animation_6shfu"), &"CurseHit": SubResource("Animation_30xy4"),
&"RESET": SubResource("Animation_cftgd") &"EarthHit": SubResource("Animation_3pm1j"),
&"FireHit": SubResource("Animation_6shfu"),
&"HolyHit": SubResource("Animation_f5cjs"),
&"RESET": SubResource("Animation_cftgd"),
&"RustActivate": SubResource("Animation_0tqwp"),
&"WaterHit": SubResource("Animation_q5dfb"),
&"WindHit": SubResource("Animation_godpv")
} }
[node name="EnemyModelView" type="Node3D"] [node name="EnemyModelView" type="Node3D"]
@@ -4625,66 +5020,59 @@ position = Vector2(400, 400)
sprite_frames = SubResource("SpriteFrames_sobol") sprite_frames = SubResource("SpriteFrames_sobol")
animation = &"idle_front" animation = &"idle_front"
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="VFXSprites" type="Node2D" parent="Sprite3D/SubViewportContainer/SubViewport"]
[node name="Rust Activation Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(1.54, 1.54) scale = Vector2(1.54, 1.54)
sprite_frames = SubResource("SpriteFrames_s0t7i") sprite_frames = SubResource("SpriteFrames_s0t7i")
frame = 88 frame = 88
frame_progress = 1.0
[node name="Holy Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Holy Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(0.675, 0.675) scale = Vector2(0.675, 0.675)
sprite_frames = SubResource("SpriteFrames_jy23v") sprite_frames = SubResource("SpriteFrames_jy23v")
animation = &"HOLY" animation = &"HOLY"
frame = 20
frame_progress = 1.0
[node name="Wind Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Wind Hit Layer Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(1.445, 1.445) scale = Vector2(1.445, 1.445)
sprite_frames = SubResource("SpriteFrames_olmld") sprite_frames = SubResource("SpriteFrames_olmld")
frame = 50 frame = 50
frame_progress = 1.0
[node name="Flame Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Flame Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(3.445, 3.445) scale = Vector2(3.445, 3.445)
sprite_frames = SubResource("SpriteFrames_a23f0") sprite_frames = SubResource("SpriteFrames_a23f0")
animation = &"Flame Damage" animation = &"Flame Damage"
frame = 40 frame = 40
[node name="Water Hit Layer 1 Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Water Hit Layer 1 Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(2.215, 2.215) scale = Vector2(2.215, 2.215)
sprite_frames = SubResource("SpriteFrames_bsjfy") sprite_frames = SubResource("SpriteFrames_bsjfy")
animation = &"WATER DAMAGE" animation = &"WATER DAMAGE"
frame = 29 frame = 29
frame_progress = 1.0
[node name="Water Hit Layer 2Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Water Hit Layer 2Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(1.105, 0.895) scale = Vector2(1.105, 0.895)
sprite_frames = SubResource("SpriteFrames_cht2c") sprite_frames = SubResource("SpriteFrames_cht2c")
animation = &"WATER" animation = &"WATER"
frame = 51 frame = 51
frame_progress = 1.0
[node name="Curse Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Curse Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
texture_filter = 1 texture_filter = 1
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(2.78, 2.78) scale = Vector2(2.78, 2.78)
sprite_frames = SubResource("SpriteFrames_v3crq") sprite_frames = SubResource("SpriteFrames_v3crq")
frame = 47 frame = 47
frame_progress = 1.0
[node name="Earth Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport"] [node name="Earth Hit Effect" type="AnimatedSprite2D" parent="Sprite3D/SubViewportContainer/SubViewport/VFXSprites"]
position = Vector2(400, 400) position = Vector2(400, 400)
scale = Vector2(2.005, 2.005) scale = Vector2(2.005, 2.005)
sprite_frames = SubResource("SpriteFrames_bsjfy") sprite_frames = SubResource("SpriteFrames_bsjfy")
animation = &"WATER DAMAGE" animation = &"WATER DAMAGE"
frame = 29
frame_progress = 1.0
[node name="Hitbox" type="Area3D" parent="."] [node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@@ -4731,8 +5119,53 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.72758, 0)
autoplay = true autoplay = true
bus = &"SFX" bus = &"SFX"
[node name="Flame Animation Player" type="AnimationPlayer" parent="."] [node name="VFXAnimations" type="Node" parent="."]
root_node = NodePath("../Secondary Animation Player")
[node name="FlameHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="RustHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="HolyHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="WindHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="WaterHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="CurseHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = {
&"": SubResource("AnimationLibrary_0tqwp")
}
[node name="EarthHitAnimation" type="AnimationPlayer" parent="VFXAnimations"]
unique_name_in_owner = true
root_node = NodePath("../../Secondary Animation Player")
libraries = { libraries = {
&"": SubResource("AnimationLibrary_0tqwp") &"": SubResource("AnimationLibrary_0tqwp")
} }

View File

@@ -55,6 +55,11 @@ public partial class DemonWallArm : EnemyModelView
} }
} }
public override void PlayElementalDamageAnimation(ElementType elementType)
{
}
public void OnExitTree() public void OnExitTree()
{ {
Hitbox.AreaEntered -= Hitbox_AreaEntered; Hitbox.AreaEntered -= Hitbox_AreaEntered;

View File

@@ -879,7 +879,7 @@ public partial class Game : Node3D, IGame
private void RustTimeout() private void RustTimeout()
{ {
_player.HealthComponent.Damage(3); _player.HealthComponent.Damage(3, ElementType.Ferrum);
} }
private void RustWoreOff() => _player.StatusEffectComponent.Rust.OnNext(false); private void RustWoreOff() => _player.StatusEffectComponent.Rust.OnNext(false);

View File

@@ -100,7 +100,7 @@ public class EffectService
foreach (var enemy in currentEnemies) foreach (var enemy in currentEnemies)
{ {
var absorbAmount = enemy.HealthComponent.CurrentHP.Value * 0.25; var absorbAmount = enemy.HealthComponent.CurrentHP.Value * 0.25;
enemy.HealthComponent.Damage((int)absorbAmount); enemy.HealthComponent.Damage((int)absorbAmount, ElementType.None);
hpToAbsorb += absorbAmount; hpToAbsorb += absorbAmount;
enemy.OnAbsorb(); enemy.OnAbsorb();
} }
@@ -118,7 +118,7 @@ public class EffectService
foreach (var enemy in currentEnemies) foreach (var enemy in currentEnemies)
{ {
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(20, elementType), 10, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(new AttackData(20, elementType), 10, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, elementType);
} }
} }

View File

@@ -38,7 +38,7 @@ public partial class SetItem : RigidBody3D
if (area.GetOwner() is ExplodableWall wall) if (area.GetOwner() is ExplodableWall wall)
wall.Demolish(); wall.Demolish();
if (area.GetOwner() is IEnemy enemy) if (area.GetOwner() is IEnemy enemy)
enemy.HealthComponent.Damage(10); enemy.HealthComponent.Damage(10, ElementType.Igneous);
} }
public async void Set() public async void Set()

View File

@@ -148,14 +148,14 @@ public partial class ThrownItem : RigidBody3D, IThrownItem
break; break;
default: default:
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(usableItem.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(new AttackData(usableItem.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, ElementType.None);
break; break;
} }
} }
else else
{ {
var damageDealt = DamageCalculator.CalculateDamage(new AttackData(ItemThatIsThrown.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(new AttackData(ItemThatIsThrown.ThrowDamage, ElementType.None), enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, ElementType.None);
} }
} }

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://bl4xempufmgr5" uid="uid://bl4xempufmgr5"
path.bptc="res://.godot/imported/PALM OF HEAVEN.PNG-35554a412a9c4bc09647efa86e6b581e.bptc.ctex" path.bptc="res://.godot/imported/palm of heaven.png-8afcb54f797720ff29f3c00c68c0f579.bptc.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "imported_formats": ["s3tc_bptc"],
"vram_texture": true "vram_texture": true
@@ -11,8 +11,8 @@ metadata={
[deps] [deps]
source_file="res://src/items/weapons/textures/PALM OF HEAVEN.PNG" source_file="res://src/items/weapons/textures/palm of heaven.png"
dest_files=["res://.godot/imported/PALM OF HEAVEN.PNG-35554a412a9c4bc09647efa86e6b581e.bptc.ctex"] dest_files=["res://.godot/imported/palm of heaven.png-8afcb54f797720ff29f3c00c68c0f579.bptc.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cp0er3xxxjkr5" uid="uid://cp0er3xxxjkr5"
path="res://.godot/imported/a2-puer_AREA_2_MAIN_222STONE.png-139f243ac630853348798dfe584da1e0.ctex" path="res://.godot/imported/A2-Puer_AREA_2_MAIN_222STONE.png-992459ef9849c39922a9b9e0c7774a4a.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_AREA_2_MAIN_222STONE.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_AREA_2_MAIN_222STONE.png"
dest_files=["res://.godot/imported/a2-puer_AREA_2_MAIN_222STONE.png-139f243ac630853348798dfe584da1e0.ctex"] dest_files=["res://.godot/imported/A2-Puer_AREA_2_MAIN_222STONE.png-992459ef9849c39922a9b9e0c7774a4a.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://5r16swvuqjjg" uid="uid://5r16swvuqjjg"
path="res://.godot/imported/a2-puer_AREA_2_MAIN_STONE.png-986249227e569ea1e40b4825b7f05c47.ctex" path="res://.godot/imported/A2-Puer_AREA_2_MAIN_STONE.png-2267bd7e464cdc2e03c8954de01941bf.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_AREA_2_MAIN_STONE.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_AREA_2_MAIN_STONE.png"
dest_files=["res://.godot/imported/a2-puer_AREA_2_MAIN_STONE.png-986249227e569ea1e40b4825b7f05c47.ctex"] dest_files=["res://.godot/imported/A2-Puer_AREA_2_MAIN_STONE.png-2267bd7e464cdc2e03c8954de01941bf.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cvnpxln2mmtkp" uid="uid://cvnpxln2mmtkp"
path="res://.godot/imported/a2-puer_COLUMN_WHITE.png-0b80d510851319464b2ef729d8868892.ctex" path="res://.godot/imported/A2-Puer_COLUMN_WHITE.png-18037c22b966bb159d05cb7acac1bc53.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_COLUMN_WHITE.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_COLUMN_WHITE.png"
dest_files=["res://.godot/imported/a2-puer_COLUMN_WHITE.png-0b80d510851319464b2ef729d8868892.ctex"] dest_files=["res://.godot/imported/A2-Puer_COLUMN_WHITE.png-18037c22b966bb159d05cb7acac1bc53.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://tjtjbktl51kd" uid="uid://tjtjbktl51kd"
path="res://.godot/imported/a2-puer_GREENBIT.png-e1ed395f917a2fe57ed6288185af0729.ctex" path="res://.godot/imported/A2-Puer_GREENBIT.png-40a9ca6a0efc569a5f329f19b3c3e572.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_GREENBIT.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_GREENBIT.png"
dest_files=["res://.godot/imported/a2-puer_GREENBIT.png-e1ed395f917a2fe57ed6288185af0729.ctex"] dest_files=["res://.godot/imported/A2-Puer_GREENBIT.png-40a9ca6a0efc569a5f329f19b3c3e572.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dqfdyguq83bhs" uid="uid://dqfdyguq83bhs"
path="res://.godot/imported/a2-puer_M13_14.png-ed8b29b0af1c2b973bfaee62e57cab14.ctex" path="res://.godot/imported/A2-Puer_M13_14.png-e781478f15895763a566a64ff37db311.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_M13_14.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_M13_14.png"
dest_files=["res://.godot/imported/a2-puer_M13_14.png-ed8b29b0af1c2b973bfaee62e57cab14.ctex"] dest_files=["res://.godot/imported/A2-Puer_M13_14.png-e781478f15895763a566a64ff37db311.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dorqwrqy03rim" uid="uid://dorqwrqy03rim"
path="res://.godot/imported/a2-puer_M13_49.png-86429b5a3cd80a9159f32ded99a631bc.ctex" path="res://.godot/imported/A2-Puer_M13_49.png-44faadb5ae300e9ecea145cfe1949536.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_M13_49.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_M13_49.png"
dest_files=["res://.godot/imported/a2-puer_M13_49.png-86429b5a3cd80a9159f32ded99a631bc.ctex"] dest_files=["res://.godot/imported/A2-Puer_M13_49.png-44faadb5ae300e9ecea145cfe1949536.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://nl3bwenfa8fi" uid="uid://nl3bwenfa8fi"
path="res://.godot/imported/a2-puer_RUBBLE_1.png-c7185e2aad2613007d1951f1515ef882.ctex" path="res://.godot/imported/A2-Puer_RUBBLE_1.png-72d7ff861d1df58d800502546da8d607.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_RUBBLE_1.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_RUBBLE_1.png"
dest_files=["res://.godot/imported/a2-puer_RUBBLE_1.png-c7185e2aad2613007d1951f1515ef882.ctex"] dest_files=["res://.godot/imported/A2-Puer_RUBBLE_1.png-72d7ff861d1df58d800502546da8d607.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://0p6suo7fpxum" uid="uid://0p6suo7fpxum"
path="res://.godot/imported/a2-puer_STUCCO_DECAL_BIG.png-882b477f490f6ddbf5bffb3a6f8904e1.ctex" path="res://.godot/imported/A2-Puer_STUCCO_DECAL_BIG.png-015d9f8dd06372231a1f422979d3604e.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_STUCCO_DECAL_BIG.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_STUCCO_DECAL_BIG.png"
dest_files=["res://.godot/imported/a2-puer_STUCCO_DECAL_BIG.png-882b477f490f6ddbf5bffb3a6f8904e1.ctex"] dest_files=["res://.godot/imported/A2-Puer_STUCCO_DECAL_BIG.png-015d9f8dd06372231a1f422979d3604e.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://ct3mkni0v0y3g" uid="uid://ct3mkni0v0y3g"
path="res://.godot/imported/a2-puer_Tile 4.png-9d089a32db3fc38a0c5dee6cdb6d3495.ctex" path="res://.godot/imported/A2-Puer_Tile 4.png-0cfd085ec5fcea35eb2d1373e4717f77.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_Tile 4.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_Tile 4.png"
dest_files=["res://.godot/imported/a2-puer_Tile 4.png-9d089a32db3fc38a0c5dee6cdb6d3495.ctex"] dest_files=["res://.godot/imported/A2-Puer_Tile 4.png-0cfd085ec5fcea35eb2d1373e4717f77.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://b40fbcriycpp5" uid="uid://b40fbcriycpp5"
path="res://.godot/imported/a2-puer_imag2esnormal.jpg-d6e063b2785344af34fa3bb45d47aa2f.ctex" path="res://.godot/imported/A2-Puer_imag2esnormal.jpg-be023c8af9ff59eedfb3ede232c75195.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_imag2esnormal.jpg" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_imag2esnormal.jpg"
dest_files=["res://.godot/imported/a2-puer_imag2esnormal.jpg-d6e063b2785344af34fa3bb45d47aa2f.ctex"] dest_files=["res://.godot/imported/A2-Puer_imag2esnormal.jpg-be023c8af9ff59eedfb3ede232c75195.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://b25r6gysyhu3e" uid="uid://b25r6gysyhu3e"
path="res://.godot/imported/a2-puer_inner_rock2.png-943622742770f7b55d1e40645d07d057.ctex" path="res://.godot/imported/A2-Puer_inner_rock2.png-7c99975de214e5dddd3507f87212b910.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_inner_rock2.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_inner_rock2.png"
dest_files=["res://.godot/imported/a2-puer_inner_rock2.png-943622742770f7b55d1e40645d07d057.ctex"] dest_files=["res://.godot/imported/A2-Puer_inner_rock2.png-7c99975de214e5dddd3507f87212b910.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cw4hq3kofjowa" uid="uid://cw4hq3kofjowa"
path="res://.godot/imported/a2-puer_lime_hand_relief.png-85b73e808337e8b8841453cbda0e78cd.ctex" path="res://.godot/imported/A2-Puer_lime_hand_relief.png-825857ea33249fe0361c829ba37bbfdb.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_lime_hand_relief.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_lime_hand_relief.png"
dest_files=["res://.godot/imported/a2-puer_lime_hand_relief.png-85b73e808337e8b8841453cbda0e78cd.ctex"] dest_files=["res://.godot/imported/A2-Puer_lime_hand_relief.png-825857ea33249fe0361c829ba37bbfdb.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://bqrsde28o867s" uid="uid://bqrsde28o867s"
path="res://.godot/imported/a2-puer_mother_GREEN.png-7bb7d8dd57027953ba1e08ed0c256c8b.ctex" path="res://.godot/imported/A2-Puer_mother_GREEN.png-ba1f3d21981ed19fc5cc87868e04808c.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_mother_GREEN.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_mother_GREEN.png"
dest_files=["res://.godot/imported/a2-puer_mother_GREEN.png-7bb7d8dd57027953ba1e08ed0c256c8b.ctex"] dest_files=["res://.godot/imported/A2-Puer_mother_GREEN.png-ba1f3d21981ed19fc5cc87868e04808c.ctex"]
[params] [params]

View File

@@ -3,7 +3,7 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://4aq3a26dliyg" uid="uid://4aq3a26dliyg"
path="res://.godot/imported/a2-puer_swirled_column _AREA222.png-6f90c188eae5b7e81110f39984d5d43f.ctex" path="res://.godot/imported/A2-Puer_swirled_column _AREA222.png-4842b180cffdbc0274ecb9cbbbbc8221.ctex"
metadata={ metadata={
"vram_texture": false "vram_texture": false
} }
@@ -13,8 +13,8 @@ generator_parameters={
[deps] [deps]
source_file="res://src/map/dungeon/models/Area 2/Puer/a2-puer_swirled_column _AREA222.png" source_file="res://src/map/dungeon/models/Area 2/Puer/A2-Puer_swirled_column _AREA222.png"
dest_files=["res://.godot/imported/a2-puer_swirled_column _AREA222.png-6f90c188eae5b7e81110f39984d5d43f.ctex"] dest_files=["res://.godot/imported/A2-Puer_swirled_column _AREA222.png-4842b180cffdbc0274ecb9cbbbbc8221.ctex"]
[params] [params]

View File

@@ -22,50 +22,50 @@ public partial class Npc : Node3D
public void OnReady() public void OnReady()
{ {
SetPhysicsProcess(true); SetPhysicsProcess(true);
DialogueZone.BodyEntered += DialogueZone_BodyEntered; DialogueZone.BodyEntered += DialogueZone_BodyEntered;
DialogueZone.BodyExited += DialogueZone_BodyExited; DialogueZone.BodyExited += DialogueZone_BodyExited;
DialogueExitZone.BodyExited += DialogueExitZone_BodyExited; DialogueExitZone.BodyExited += DialogueExitZone_BodyExited;
Hitbox.AreaEntered += Hitbox_AreaEntered; Hitbox.AreaEntered += Hitbox_AreaEntered;
} }
private void Hitbox_AreaEntered(Area3D area) private void Hitbox_AreaEntered(Area3D area)
{ {
if (area.GetOwner() is ThrownItem thrownItem) if (area.GetOwner() is ThrownItem thrownItem)
{ {
DialogueController.ShowDialogue(Dialogue, "get_item"); DialogueController.ShowDialogue(Dialogue, "get_item");
thrownItem.QueueFree(); thrownItem.QueueFree();
} }
} }
private void DialogueZone_BodyExited(Node3D body) private void DialogueZone_BodyExited(Node3D body)
{ {
_isInDialogueZone = false; _isInDialogueZone = false;
} }
private void DialogueExitZone_BodyExited(Node3D body) private void DialogueExitZone_BodyExited(Node3D body)
{ {
DialogueController.Interrupt(); DialogueController.Interrupt();
} }
private void DialogueZone_BodyEntered(Node3D body) private void DialogueZone_BodyEntered(Node3D body)
{ {
_isInDialogueZone = true; _isInDialogueZone = true;
} }
public override void _UnhandledInput(InputEvent @event) public override void _Input(InputEvent @event)
{ {
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone) if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone)
{ {
DialogueController.ShowDialogue(Dialogue, "general"); DialogueController.ShowDialogue(Dialogue, "general");
} }
} }
public void OnExitTree() public void OnExitTree()
{ {
DialogueZone.BodyEntered -= DialogueZone_BodyEntered; DialogueZone.BodyEntered -= DialogueZone_BodyEntered;
DialogueZone.BodyExited -= DialogueZone_BodyExited; DialogueZone.BodyExited -= DialogueZone_BodyExited;
DialogueExitZone.BodyExited -= DialogueExitZone_BodyExited; DialogueExitZone.BodyExited -= DialogueExitZone_BodyExited;
Hitbox.AreaEntered -= Hitbox_AreaEntered; Hitbox.AreaEntered -= Hitbox_AreaEntered;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -36,7 +36,7 @@ public partial class PlayerProjectile : RigidBody3D
{ {
var projectileDamage = new AttackData(AttackData.Damage, AttackData.ElementType, false, false); var projectileDamage = new AttackData(AttackData.Damage, AttackData.ElementType, false, false);
var damageDealt = DamageCalculator.CalculateDamage(projectileDamage, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet); var damageDealt = DamageCalculator.CalculateDamage(projectileDamage, enemy.DefenseComponent.CurrentDefense.Value, enemy.ElementalResistanceSet);
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt, AttackData.ElementType);
CallDeferred(MethodName.QueueFree); CallDeferred(MethodName.QueueFree);
} }
} }